2
votes

Pourquoi passer (! NULL) dans la condition if-else est-il vrai en C?

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?


0 commentaires

3 Réponses :


2
votes

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é.


0 commentaires

7
votes

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().


0 commentaires

1
votes

En bref: -

Selon les normes de codage C ,

La valeur différente de zéro équivaut à TRUE
Zéro et NULL sont équivalents à FAUX

Par conséquent, (! NULL) équivaut à TRUE . Donc, si le bloc est en cours d'exécution et un. est imprimé.


0 commentaires