Mylisz wiele różnych rzeczy: instrukcje sterujące, operatory i typy boolowskie. Każdy ma swoje własne zasady.
Instrukcje kontrolne działają jak na przykład ifinstrukcja C11 6.4.8.1:
W obu formach pierwsze podstacja jest wykonywana, jeśli wyrażenie porównuje nierówność z 0.
while, forEtc mają taką samą regułę. Nie ma to nic wspólnego z „prawdą” lub „fałszem”.
Jeśli chodzi o operatory, które rzekomo dają wynik boolowski, w rzeczywistości dają one wynik into wartości 1 lub 0. Na przykład operatory równości, C11 6.5.9:
Każdy z operatorów daje 1, jeśli określona relacja jest prawdą, i 0, jeśli jest fałszywa
Wszystko to wynika z tego, że C nie miał typu boolowskiego aż do roku 1999, a nawet kiedy go otrzymał, powyższe zasady nie zostały zmienione. Tak więc w przeciwieństwie do większości innych języków programowania, w których instrukcje i operatory dają typ boolowski (jak C ++ i Java), po prostu dają intznak o wartości zero lub niezerowej. Na przykład sizeof(1==1)da 4 w C, ale 1 w C ++.
Rzeczywisty typ boolowski w C jest nazwany _Booli wymaga nowoczesnego kompilatora. Nagłówek stdbool.hmakra Definiuje bool, trueoraz false, że rozszerzają się _Bool, 1a 0odpowiednio (dla kompatybilności z C ++).
Uważa się jednak, że dobrą praktyką programowania jest traktowanie instrukcji sterujących i operatorów tak, jakby faktycznie wymagały / dawały typ boolowski. Niektóre standardy kodowania, takie jak MISRA-C, zalecają taką praktykę. To jest:
if(ptr == NULL)zamiast if(ptr).
if((data & mask) != 0)zamiast if(data & mask).
Celem takiego stylu jest zwiększenie bezpieczeństwa typów za pomocą narzędzi do analizy statycznej, co z kolei zmniejsza liczbę błędów. Prawdopodobnie ten styl ma znaczenie tylko wtedy, gdy używasz analizatorów statycznych. Chociaż w niektórych przypadkach prowadzi to na przykład do bardziej czytelnego, samodokumentującego się kodu
if(c == '\0')
Dobrze, zamiar jest jasny, kod samodokumentuje się.
przeciw
if(c)
Zły. Może oznaczać wszystko i musimy poszukać typu, caby zrozumieć kod. Czy jest to liczba całkowita, wskaźnik czy znak?