Ist (0==0)==1 Standard?



  • Du kannst dich drauf verlassen. Der Wahrheitswert true ist immer 1. Was anderes ist, wenn du von außen irgendwelche Werte hereinbekommst, bei denen es nur darauf ankommt, ob sie nonzero sind. Die musst du dann halt extra mit (x != 0) auf 0 oder 1 beschränken.



  • oki thx!



  • Wobei ich an der Stelle wohl doch eher

    a = b - (b == c ? 5 : 0);
    

    schreiben würde.



  • Boolesche Ausdruecke liefern in C und C++ immer "1" fuer wahr, und "0" fuer falsch -- aber obacht, fuer einen nicht-booleschen Ausdruck gilt: != 0 ist "wahr", und == 0 "falsch".

    Ausdruecke wie

    if ( !strcmp( ... ) ) ...
    if ( ptr ) ...
    

    sind zwar gueltiger C/C++ Code, aber mehr als Stilblueten anzusehen, da ja bei "if" eigentlich ein boolescher Ausdruck verwendet werden sollte.

    Deshalb sind

    if ( strcmp( ... ) == 0 ) ...
    if ( ptr != 0 ) ...
    

    besser und, vor allem, lesbarer.



  • Power Off schrieb:

    Ausdruecke wie

    if ( !strcmp( ... ) ) ...
    if ( ptr ) ...
    

    sind zwar gueltiger C/C++ Code, aber mehr als Stilblueten anzusehen, da ja bei "if" eigentlich ein boolescher Ausdruck verwendet werden sollte.
    [/cpp]

    Das sind durchaus übliche Formulierungen (genauso üblich wie ein ==0 dahinter). Stielblüten sehe ich da nicht.



  • Taurin schrieb:

    Das sind durchaus übliche Formulierungen (genauso üblich wie ein ==0 dahinter). Stielblüten sehe ich da nicht.

    Na ja, wenn Du Code hast mit hunderten von "!strcmp()" kann das schon etwas verwirrend sein, wenn man es liest als "not strcmp()".



  • Das stimmt, aber die Schreibweise "if (ptr)" find ich sehr gut lesbar, viel angenehmer als das != 0 oder != NULL. Ersteres ist außerdem nur in C++ erlaubt, nicht in C.



  • Ringding schrieb:

    Das stimmt, aber die Schreibweise "if (ptr)" find ich sehr gut lesbar, viel angenehmer als das != 0 oder != NULL. Ersteres ist außerdem nur in C++ erlaubt, nicht in C.

    Falsch.



  • Auch in C gilt (von dort kommt es), dass, wenn 0 einem Pointer zugewiesen wird, dies in eine interne Repraesentation eines Nullpointers umgewandelt werden kann, und dass auch Vergleiche von Nullpointern mit 0 funktionieren muessen.

    Deshalb ist "0" besser als "NULL", weil "NULL" als Makro definiert ist, und nicht unbedingt zu dem expandiert, was man erwartet. Wenn z.B. "NULL" verwendet wird, statt 0, und "NULL" als "((void*)(0))" definiert ist, kann es zu Fehlermeldungen beim Casting kommen, wenn der Compiler nicht standardkonform ist, was eher die Regel als die Ausnahme ist. (z.B. muss man malloc() returns bei den meisten Compilern -- die ich bis jetzt benutzt habe -- casten, obwohl im Standard steht, dass ein Cast von und nach "void*" nicht erforderlich ist; bei frueheren Standards war das aber so, dass man bei der Zuweisung von "void*" ausdruecklich casten musste)



  • Ich kenne keinen C-Compiler, der 'int *p = malloc(sizeof *p);' nicht übersetzten kann, wenn alle erforderlichen Header eingebunden sind (also stdlib.h, bzw. 'früher' malloc.h). Auch in 'früheren' C-Standards, mußte man nicht casten, nicht mal in K&R-C, wenn ich mich recht entsinne. Wenn man auf die seltsame Idee verfällt, seinen C-Quelltext mit Compilern einer anderen Sprache wie Pascal, Ada oder C++ zu übersetzten, dann braucht man sich nicht wundern, wenn es nicht funktioniert.

    Was das alles mit NULL vs. 0 zu tun hat, ist mir schleierhaft. Im Zeigerkontext werden beide Ausdrücke zu Nullzeigerkonstanten, in C wie in C++.


Anmelden zum Antworten