2017-10-19 16 views
6

Disons que a est un pointeur, et après l'allocation de mémoire pour elle, je veux vérifier si la mémoire a été attribué avec succès, je l'ai vu deux façons faire:En C, la condition: "if (a! = NULL)" est-elle la même que la condition "if (a)"?

if(a != NULL) 

if(a) 

Quelle est la différence entre la première et les secondes déclarations?

+4

Ils finiront par la même chose. – Steve

+0

NULL est une macro qui est généralement définie comme 0, donc la première expression est identique à (a! = 0), la seconde vérifie également si a = 0, donc c'est la même édition: typiquement –

+0

Oui, si * 'a' * est un pointeur, il pourrait être différent si 'a' n'est pas un pointeur selon la définition de' NULL'. –

Répondre

0

(a! = NULL) retourne un booléen qui est la même chose pour (a). Une instruction if renvoie la valeur false si le contenu est égal à 0 et vrai dans le cas contraire. NULL signifie 0 donc si a == 0 if retourne false. Donc, c'est exactement la même chose pour le compilateur.

J'espère que cela vous aidera!

0

Il n'y a pas de différence fonctionnelle; ils sont équivalents et ils testent tous deux le pointeur nul.

Toute préférence est purement subjective. Utilisez simplement celui que vous aimez ou ce qui est suivi par vos collègues programmeurs dans votre projet/organisation.

+0

Pourriez-vous élaborer un peu? – Marievi

2

est la condition: if(a != NULL) la même que la condition if(a)?

Ils atteignent le même but. La seule vraie différence est dans la lisibilité.


Leur effet est le même, car ils aboutiront à la même chose.

NULL est une macro qui est presque toujours 0, donc:

if(a != NULL) 

équivaut à:

if(a != 0) 

qui est assez similaire à:

if(a) 

car il sera vérifie si l'expression a est vraie. Donc, si a est un pointeur, ils seront identiques. Si ce n'est pas le cas, cela dépendra de la définition de NULL (qui, comme je l'ai dit, est almost always 0).

+1

Pourriez-vous élaborer un peu? – Marievi

+0

sûr @Marievi, sur mon chemin. – gsamaras

1

Selon c faq:

si (p) est équivalent à if (! P = 0)

ce qui est un contexte de comparaison, donc le compilateur peut dire que le (implicite) 0 est en fait un pointeur nul constante et utilise la valeur correcte du pointeur NULL. Il n'y a pas de supercherie impliqué ici; Les compilateurs fonctionnent de cette façon et génèrent le même code pour les deux constructions. La représentation interne d'un pointeur nul n'a pas d'importance.