136 votes

Double négation dans le code C++

Je viens de tomber sur un projet avec un assez énorme base de code.

Je suis surtout aux prises avec C++ et beaucoup de code à écrire utilise la double négation de leur logique booléenne.

 if (!!variable && (!!api.lookup("some-string"))) {
       do_some_stuff();
 }                                   

Je sais que ces gars-là sont intelligents programmeurs, il est évident qu'ils ne font pas cela par hasard.

Je ne suis pas assaisonné C++ expert, mon seul deviner pourquoi ils font ce qu'ils veulent faire absolument certain que la valeur évaluée est la représentation booléenne. Donc, ils nient, puis nier qu'à nouveau pour le faire revenir à sa réelle valeur booléenne.

Est-ce correct, ou alors j'ai loupé quelque chose?

132voto

Don Neufeld Points 12803

C’est un truc pour convertir en bool.

75voto

Tom Barta Points 606

C'est en fait très utile idiome dans certains contextes. Prendre ces macros (par exemple à partir du noyau Linux). Pour GCC, ils sont mis en œuvre comme suit:

#define likely(cond)   (__builtin_expect(!!(cond), 1))
#define unlikely(cond) (__builtin_expect(!!(cond), 0))

Pourquoi font-ils cela? De GCC __builtin_expect traite ses paramètres long et pas bool, donc il doit y avoir une certaine forme de conversion. Car ils ne savent pas ce qu' cond , c'est quand ils sont en train d'écrire ces macros, il est plus générale pour tout simplement utiliser l' !! idiome.

Ils pourraient probablement faire la même chose en le comparant à 0, mais à mon avis, c'est effectivement plus simple de faire la double négation, puisque c'est la plus proche d'un cast-à-bool que C est.

Ce code peut être utilisé en C++ aussi bien... c'est un plus petit dénominateur commun de la chose. Si possible, faire ce qui fonctionne dans les deux C et C++.

53voto

fizzer Points 8193

Les codeurs pensent qu’il va convertir l’opérande en bool, mais parce que les opérandes de & & sont déjà implicitement converti en bool, c’est tout à fait redondant.

14voto

jwfearn Points 8813

Oui, c’est une conversion en bool. Voir cette question pour une discussion plus.

12voto

Richard Harrison Points 14891

C’est une technique pour éviter d’écrire (variable ! = 0) - c'est-à-dire pour convertir de quelque nature c’est à un bool.

Code de l’OMI comme ça n’a aucune place dans les systèmes qui doivent être maintenus - parce qu’il n’est pas immédiatement lisible code (d'où la question en premier lieu).

Le code doit être lisible - sinon vous laisser une dette de temps héritage pour l’avenir - qu’il faut du temps pour comprendre quelque chose qui est inutilement compliqué.

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