NULL



  • Mal ne Frage, müsste "NULL" nicht eigendlich eine art variable für "nichts" sein?

    wenn ich "NULL" einprogramme (int x=NULL;) funktioniert das nicht so..

    hatte vor mir son kleinen counter zu proggen sowas wie:

    days:hours:mins:seks
    00:00:00:00

    an sich ja nichts schwieriges, nur ich wollte halt eine Doppelnull haben bzw ne 2te Null wenns einstellig ist..

    ums mal mit einem (nicht funktionierenden) C code zu fomulieren:

    if(seks>9) nichts=NULL;
    else nichts=0;
    
    printf("%i%i Sekunden",nichts,seks);
    

    müsste klar sein was ich möchte, oder? bei sekunden von 0-9 soll der wert "nichts" eine 0 sein. -> 0 und sekunden anzahl ausgegeben (01 03 08 und so)
    ansonsten (ist ja dann 10 bis 59 groß) soll "nichts" auch nichts sein.
    also das erste %i gibt rein garnichts aus.

    Ich möchte keinen fertigen programm scripts, ich hab selbst schon nen prog, auch keine walkarounds 😕 meine frage is lediglich, was ich machen muss damit "Null" funktioniert.

    danke im vorraus!



  • Es gibt keinen "nichts"-Wert. Es gibt höchstens den NULL-Zeiger, mit dem man anzeigen kann, dass ein Zeiger auf nichts zeigt. Aber eben nur Zeiger.

    Mit printf kann man Zahlen aber auch formatiert ausgeben:

    printf("%02d", seks);
    


  • omg stimmt so gehts auch
    ^^" danke für die hilfe..



  • ist NULL das Selbe wie 0



  • genauer gesagt schrieb:

    ist NULL das Selbe wie 0

    IMHO darf ein "implementation-defined null pointer" (7.17) auch z.B. ((void*)0) sein.



  • LordJaxom schrieb:

    genauer gesagt schrieb:

    ist NULL das Selbe wie 0

    IMHO darf ein "implementation-defined null pointer" (7.17) auch z.B. ((void*)0) sein.

    Noch genauer wäre nicht darf, sondern MUSS (void*)0 sein, damit die Typenrichtigkeit erhalten bleibt. Bei

    if (0 == NULL)
    

    sollte der Compiler meckern. 😉



  • pointercrash() schrieb:

    Bei

    if (0 == NULL)
    

    sollte der Compiler meckern.

    ja, aber nicht das was du erwartest, sondern er meckert: 'condition always true', was soviel heisst wie: 'diese if-abfrage sieht zwar schick aus, ist aber bestenfalls als ersatz für #if 0 ... #endif oder /* ... */ zu gebrauchen'.
    0 und NULL sind, aus sicht der programmlogik, das selbe.
    🙂



  • zero-freak schrieb:

    ja, aber nicht das was du erwartest, sondern er meckert: 'condition always true', 0 und NULL sind, aus sicht der programmlogik, das selbe.

    Ja, nö, war mir schon klar, war auch eher transfermäßig gemeint, aber Du hast mich stutzig gemacht. Keine Chance zum Wegoptimieren hat der Compiler bei sowas:

    volatile int nullinger = 73;
    // -------------------------
    int foo(void)
    {
    	while (nullinger)
    	{
    	if (nullinger != NULL)
    		nullinger++;
    	}
    	return nullinger;
    }
    

    und da wird wirklich echter Code erzeugt, es wird auch nicht gemotzt und er kommt auch mit 'ner int 0 aus der Funktion.
    Meine blöde Frage, wieso es ihn nicht kratzt, ungleiche Typen zu vergleichen, nichtmal eine Warning, hab' schon zwei Compiler damit gefüttert. 😕



  • (void*)0 und 0 sind das selbe. steht irgendwo im C-standard.
    🙂



  • In C:
    #define NULL ((void*)0)
    In C++:
    #define NULL 0



  • Shade Of Mine schrieb:

    In C++:
    #define NULL 0

    ehrlich? ich hätte wetten können, dass die C++ variante so aussieht:

    const int NULL = 0
    

    🙂



  • nein, da man sonst kein #ifdef NULL machen kann...



  • void*-freak schrieb:

    (void*)0 und 0 sind das selbe. steht irgendwo im C-standard. 🙂

    Warum frißt der Compiler das nicht

    while (nullinger != malloc(sizeof(nullinger)))
     nullinger++;
    

    aber mit 'nem Typecast schon:

    while (nullinger != (int) malloc(sizeof(nullinger)))
     nullinger++;
    

    Ja, ich weiß, Nonsens- Code. Aber wann sind int 0 und (void*)0 wirklich gleich 😕



  • pointercrash() schrieb:

    Aber wann sind int 0 und (void*)0 wirklich gleich 😕

    als konstanten sind sie's. du kannst überall wo (void*)0 erscheint, eine 0 hinschreiben. eine 'int' variable ist natürlich nicht dasselbe wie eine 'void*' variable, aber du kannst z.b. schreiben:

    int *a = (void*)0; // geht weil void* kompatibel mit allen pointern ist
    int *b = 0;        // geht, 0 ist hier wie (void*)0
    int *c = 1;        // geht nicht, weder 0 noch type-cast zu void* oder int*
    int d = (void*)0;  // geht nicht, inkompatibler typ (int ist kein pointer)
    

    🙂


Anmelden zum Antworten