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
Il n'y a pas de différence dans l'exemple donné.
Cependant, l'hypothèse selon laquelle cela s'applique à tous les cas est incorrecte. a = pas pas b n'est pas la même chose que a = b en ce qui concerne les types d'entiers.
En C, 0
est fausse. Tout ce qui n'est pas 0
est vrai. Mais not 0
es 1
et rien d'autre. En C++, true est converti en 1
comme un nombre entier, non seulement pour des raisons de compatibilité avec le C, mais aussi parce que 1
n'est pas 0
y 1
est la valeur la plus couramment utilisée pour indiquer vrai dans les types bools en C, y compris la fonction type officiel C bool y BOOL
utilisé dans Win32.
Alors que pour l'exemple de code donné, !!p
n'est pas nécessaire car le résultat est converti en un bool
pour l'évaluation de la if
cela n'exclut pas l'utilisation de la !!
dans le but de convertir les booléens en valeurs entières attendues. Personnellement, dans cet exemple, pour maximiser la probabilité que les changements de type et la sémantique soient clairs, j'utiliserais NULL != p
o p != NULL
pour que le sens soit absolument clair.
Cette technique est connue sous le nom d'idiome double-bang, et ce type fournit quelques bonnes justifications .
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.