Stai mescolando molte cose diverse: istruzioni di controllo, operatori e tipi booleani. Ognuno ha le proprie regole.
Le istruzioni di controllo funzionano come, ad esempio, l' ifistruzione C11 6.4.8.1:
In entrambe le forme, la prima sottostrazione viene eseguita se l'espressione è diversa da 0.
while, for così via hanno la stessa regola. Questo non ha nulla a che fare con "vero" o "falso".
Per quanto riguarda gli operatori che presumibilmente producono un risultato booleano, in realtà stanno restituendo un intcon valore 1 o 0. Ad esempio gli operatori di uguaglianza, C11 6.5.9:
Ciascuno degli operatori restituisce 1 se la relazione specificata è vera e 0 se è falsa
Tutto quanto sopra è perché C non aveva un tipo booleano fino all'anno 1999, e anche quando ne ha ottenuto uno, le regole precedenti non sono state modificate. Quindi, a differenza della maggior parte degli altri linguaggi di programmazione in cui le istruzioni e gli operatori producono un tipo booleano (come C ++ e Java), producono solo un int, con un valore zero o non zero. Per esempio,sizeof(1==1) darà 4 in C ma 1 in C ++.
Il tipo booleano effettivo in C è denominato _Boole richiede un compilatore moderno. L'intestazione stdbool.hdefinisce macro bool, truee false, che si espandono per _Bool, 1e 0rispettivamente (per la compatibilità con C ++).
Tuttavia, è considerata buona pratica di programmazione trattare le istruzioni di controllo e gli operatori come se effettivamente richiedessero / producessero un tipo booleano. Alcuni standard di codifica come MISRA-C consigliano tale pratica. Questo è:
if(ptr == NULL)invece di if(ptr).
if((data & mask) != 0) invece di if(data & mask) .
Lo scopo di tale stile è aumentare la sicurezza dei tipi con l'aiuto di strumenti di analisi statica, che a loro volta riducono i bug. Probabilmente, questo stile è significativo solo se si utilizzano analizzatori statici. Anche se in alcuni casi porta a un codice più leggibile e auto-documentante, per esempio
if(c == '\0')
Bene, l'intento è chiaro, il codice si auto-documenta.
contro
if(c)
Male. Potrebbe significare qualsiasi cosa, e dobbiamo cercare il tipo di cper capire il codice. È un numero intero, un puntatore o un carattere?