Dans le code suivant, quel est l'avantage d'utiliser la fonction (!!p)
au lieu de (p != NULL)
?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
Dans le code suivant, quel est l'avantage d'utiliser la fonction (!!p)
au lieu de (p != NULL)
?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
C'est une question de style, en fait ils sont équivalents. Voir cette question très similaire pour la discussion.
La comparaison avec le pointeur nul est plus claire.
Je pense que le commentaire original de GMan devrait être la réponse acceptée :
Je me demande ce qu'il y a de mal à juste
if (p)
Le fait est que : rien n'est pas bon, et ce devrait être le moyen privilégié. Tout d'abord, !!p
est "trop intelligente" ; elle est également totalement inutile et donc mauvaise (remarque : nous parlons de pointeurs dans un fichier if
ici, donc le commentaire d'Anacrolix, bien que généralement valable, ne s'applique pas ici !)
Il en va de même pour p != NULL
. Bien que cela soit possible, ce n'est tout simplement pas nécessaire. C'est plus de code, c'est complètement redondant et, par conséquent, cela rend le code plus mauvais. La chose la plus vraie que Jeff Atwood ait jamais dite est que "le meilleur code est un code inexistant". Évitez la syntaxe redondante. Tenez-vous-en au minimum (qui transmet toujours le sens complet) ; if (p)
est complet).
Enfin, if (p)
est sans doute la façon la plus idiomatique d'écrire cela en C++. Le C++ se plie en quatre pour obtenir le même comportement pour d'autres types du langage (par exemple, les flux de données), au prix de quelques bizarreries très étranges. La prochaine version de la norme introduit même une nouvelle syntaxe pour obtenir ce comportement dans les types définis par l'utilisateur.
Pour les pointeurs, nous obtenons la même chose gratuitement. Alors utilise-le.
/EDIT : A propos de la clarté : sharptooth écrit que
La comparaison avec le pointeur nul est plus claire.
Je prétends que c'est objectivement faux : if (p)
est plus clair. Il est impossible que cette déclaration puisse signifier autre chose, ni dans ce contexte ni dans aucun autre, en C++.
D'après ce que je vois, c'est juste un moyen plus court de le convertir en valeur booléenne. Il applique cependant le ! deux fois, alors que p != NULL
fait une comparaison. Je suppose donc que l'avantage est un code plus court, bien que plus cryptique si vous ne savez pas ce qu'il faut faire. !!p
est censé signifier.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.