Sie vermischen viele verschiedene Dinge: Steueranweisungen, Operatoren und Boolesche Typen. Jeder hat seine eigenen Regeln.
ifSteueranweisungen funktionieren wie zum Beispiel die Anweisung C11 6.4.8.1:
In beiden Formen wird die erste Unteranweisung ausgeführt, wenn der Ausdruck ungleich 0 ist.
while, for Usw. die gleiche Regel haben. Dies hat nichts mit "wahr" oder "falsch" zu tun.
Operatoren, die angeblich ein boolesches Ergebnis intliefern, liefern tatsächlich ein Ergebnis mit dem Wert 1 oder 0. Zum Beispiel die Gleichheitsoperatoren C11 6.5.9:
Jeder der Operatoren ergibt 1, wenn die angegebene Beziehung wahr ist, und 0, wenn sie falsch ist
All dies ist darauf zurückzuführen, dass C bis zum Jahr 1999 keinen booleschen Typ hatte, und selbst wenn es einen bekam, wurden die oben genannten Regeln nicht geändert. Im Gegensatz zu den meisten anderen Programmiersprachen, in denen Anweisungen und Operatoren einen booleschen Typ ergeben (wie C ++ und Java), ergeben sie nur einen intmit dem Wert Null oder nicht Null. Beispielsweise,sizeof(1==1) wird 4 in C aber 1 in C ++ geben.
Der tatsächliche boolesche Typ in C wird benannt _Boolund erfordert einen modernen Compiler. Der Header stdbool.hdefinieren Makros bool, trueund false, die zu erweitern _Bool, 1und die 0jeweils (für die Kompatibilität mit C ++).
Es wird jedoch als gute Programmierpraxis angesehen, Steueranweisungen und Operatoren so zu behandeln, als ob sie tatsächlich einen booleschen Typ benötigen / ergeben. Bestimmte Codierungsstandards wie MISRA-C empfehlen eine solche Vorgehensweise. Das ist:
if(ptr == NULL)statt if(ptr).
if((data & mask) != 0) anstatt if(data & mask) .
Ziel eines solchen Stils ist es, die Typensicherheit mithilfe statischer Analysewerkzeuge zu erhöhen, wodurch wiederum Fehler reduziert werden. Dieser Stil ist wahrscheinlich nur dann sinnvoll, wenn Sie statische Analysegeräte verwenden. In einigen Fällen führt dies beispielsweise zu besser lesbarem, selbstdokumentierendem Code
if(c == '\0')
Gut, die Absicht ist klar, der Code ist selbstdokumentierend.
gegen
if(c)
Schlecht. Könnte alles bedeuten, und wir müssen nach dem Typ suchen c, um den Code zu verstehen. Ist es eine ganze Zahl, ein Zeiger oder ein Zeichen?