Vous mélangez beaucoup de choses différentes: instructions de contrôle, opérateurs et types booléens. Chacun a ses propres règles.
Les instructions de contrôle fonctionnent comme par exemple l' if
instruction, C11 6.4.8.1:
Dans les deux formes, la première sous-déclaration est exécutée si l'expression est différente de 0.
while
, for
etc. ont la même règle. Cela n'a rien à voir avec «vrai» ou «faux».
Quant aux opérateurs qui sont censés donner un résultat booléen, ils donnent en fait un int
avec la valeur 1 ou 0. Par exemple les opérateurs d'égalité, C11 6.5.9:
Chacun des opérateurs donne 1 si la relation spécifiée est vraie et 0 si elle est fausse
Tout ce qui précède est dû au fait que C n'avait pas de type booléen avant 1999, et même quand il en a obtenu un, les règles ci-dessus n'ont pas été modifiées. Donc, contrairement à la plupart des autres langages de programmation où les instructions et les opérateurs donnent un type booléen (comme C ++ et Java), ils donnent juste un int
, avec une valeur zéro ou non zéro. Par exemple, sizeof(1==1)
donnera 4 en C mais 1 en C ++.
Le type booléen réel en C est nommé _Bool
et nécessite un compilateur moderne. L' en- tête stdbool.h
définit les macros bool
, true
et false
, qui se développent à _Bool
, 1
et 0
respectivement (pour la compatibilité avec C ++).
Il est cependant considéré comme une bonne pratique de programmation de traiter les instructions de contrôle et les opérateurs comme s'ils exigeaient / produisaient réellement un type booléen. Certaines normes de codage comme MISRA-C recommandent une telle pratique. C'est:
if(ptr == NULL)
au lieu de if(ptr)
.
if((data & mask) != 0)
au lieu de if(data & mask)
.
Le but d'un tel style est d'augmenter la sécurité du type à l'aide d'outils d'analyse statique, ce qui réduit les bogues. On peut soutenir que ce style n'a de sens que si vous utilisez des analyseurs statiques. Bien que dans certains cas, cela conduise à un code plus lisible et auto-documenté, par exemple
if(c == '\0')
Bien, l'intention est claire, le code est auto-documenté.
contre
if(c)
Mal. Cela pourrait vouloir dire n'importe quoi, et nous devons chercher le type de c
pour comprendre le code. Est-ce un entier, un pointeur ou un caractère?