7 votes

Pourquoi/quand utiliser (!!p) au lieu de (p != NULL)

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

11voto

Wernsey Points 3227

C'est à peu près la même chose, bien que je considère que la !!p pour être un mauvais style, et indique généralement un codeur essayant d'être intelligent.

9voto

sharptooth Points 93379

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.

7voto

Konrad Rudolph Points 231505

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

3voto

Twisol Points 1061

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.

0voto

Anton Gogolev Points 59794

Voir este y este .

Prograide.com

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.

Powered by:

X