Dans ces lignes de code,
void main() { if(!NULL) { printf("one."); } else { printf("two"); } }
le résultat est un. Pourquoi donc? Pourquoi ! NULL
est-il vrai?
3 Réponses :
NULL est l'équivalent du pointeur de 0. 0 est faux en C et toute autre valeur non nulle est positive.
Par conséquent, si! (pas l'opérateur) est appliqué à NULL (faux), cela implique que! NULL est vrai.
Donc, la condition if est satisfaite comme vraie et "un". est imprimé.
De C Standard # 6.3.2.3p3 [emphase ajoutée]
3 Une expression de constante entière avec la valeur 0 , ou une telle expression convertie en
void *
, est appelée une constante de pointeur nul . . 66) Si une constante de pointeur nul est convertie en un type de pointeur, le pointeur résultant, appelé pointeur nul, est garanti de comparer une valeur inégale à un pointeur vers n'importe quel objet ou fonction.....
....66) La macro NULL est définie dans
(et d'autres en-têtes) comme une constante de pointeur nul ; voir 7.19.
De C Standard # 6.5.3.3p5
5 Le résultat de l'opérateur de négation logique! vaut 0 si la valeur de son opérande est égale à 0, 1 si la valeur de son opérande est égale à 0. Le résultat est de type int. L'expression! E équivaut à (0 == E).
Donc, cette déclaration
if (0==NULL)
équivaut à
if(!NULL)
0 == NULL
est évalué à true
. Par conséquent, vous obtenez la sortie one
.
Additional:
Le type de retour void
de main ()
n'est pas conforme à la norme. À la place, vous devriez utiliser int
comme type de retour de main()
.
En bref: -
Selon les normes de codage C ,
La valeur différente de zéro équivaut à TRUE
Zéro et NULL sont équivalents à FAUX retour
Par conséquent, (! NULL) équivaut à TRUE . Donc, si le bloc est en cours d'exécution et un. est imprimé.