Vous mélangez beaucoup de choses différentes: des instructions de contrôle, les opérateurs booléens et de types. Chacun ont leurs propres règles.
Les instructions de contrôle du travail, comme par exemple l' if
déclaration, C11 6.4.8.1:
Dans les deux formes, la première substatement est exécutée si l'expression
compare inégale à 0.
while
, for
etc ont la même règle. Cela n'a rien à voir avec le "vrai" ou "faux".
Comme pour les opérateurs qui sont soi-disant en produisant un résultat booléen, ils sont réellement, ce qui donne un int
de la valeur 1 ou 0. Par exemple, les opérateurs d'égalité, C11 6.5.9:
Chacun des opérateurs des rendements de 1 si la relation est vraie et 0
si elle est fausse
Tous les ci-dessus est parce que C n'ont pas de type booléen jusqu'à l'année 1999, et même lorsqu'il n'a en obtenir un, les règles ci-dessus n'ont pas changé. Donc, contrairement à la plupart des autres langages de programmation où les états et les opérateurs de rendement d'un type booléen (comme C++ et Java), ils ont juste donner un int
, avec une valeur nulle ou non nulle. Par exemple, sizeof(1==1)
donnera 4 en C, mais 1 en C++.
La réelle type booléen 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
, que l'élargir à d' _Bool
, 1
et 0
respectivement (pour la compatibilité avec le C++).
Il est cependant considéré comme une bonne pratique de programmation traiter des instructions de contrôle et des opérateurs comme si il nécessaire/a abouti à un type booléen. Certaines normes de codage comme MISRA-C de recommander 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 de ce style est d'augmenter la sécurité de type à l'aide de l'analyse statique des outils, ce qui réduit les bugs. Sans doute, ce style n'est utile que si vous utilisez des analyseurs statiques. Si, dans certains cas, elle conduit à plus lisible, l'auto-documentation du code, par exemple
if(c == '\0')
Bon, l'intention est claire, le code est auto-documentation.
rapport
if(c)
Mauvais. Pourrait signifier quoi que ce soit, et nous devons aller chercher le type d' c
comprendre le code. Est-il un entier, un pointeur ou un personnage?