Est-ce « un court-circuit booléen » dictée par la norme ou juste la plupart du temps utilisé comme optimisation? [dupliquer]

StackOverflow https://stackoverflow.com/questions/852676

Question

Considérez ceci

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

Sur tous les compilateurs j'ai travaillé, cela est tout à fait sûr. C'est à dire. la première partie de l'expression booléenne évaluera false , et l'appel à la méthode () ne seront donc pas été menée depuis la deuxième partie évalue est redondant.

Est-ce parce que la plupart des compilateurs optimisera loin l'évaluation de la deuxième partie, ou est-ce un comportement dicté par les normes C / C ++?

Était-ce utile?

La solution

Ceci est appelé court-circuit booléen et est défini en plusieurs langues. est un article de wikipedia qui décrit quelles langues ont cette fonctionnalité.

Maintenant que vous connaissez le nom correct pour la fonction, il y a autres SO articles à ce sujet ainsi.

Autres conseils

coupe d'expression courte est garantie par la norme.

С ++ standard 1998
Section 5.14

  

Les groupes d'opérateurs de && de gauche à droite.   Les opérandes sont à la fois implicitement   converti au type bool (article 4). le   résultat est vrai si les deux opérandes sont   vrai et faux autrement. Contrairement à &, &&   garanties de gauche à droite évaluation:   le second opérande n'a pas été évalué si   le premier opérande est faux.

Je ne l'ai pas vu encore mentionné, donc:

Un court-circuit est garantie par C ++ sauf lorsque l'opérateur ou && invoqué est || surchargée . Mais ne faites pas cela, parce qu'il est trop confus.

Ceci est une fonctionnalité appelée court-circuit. Ce comportement est garanti par la norme C de. Je ne crois pas que ce soit une optimisation pour ainsi dire, mais il est beaucoup plus simple fonction de la langue.

Il est pas l'optimisation juste, il est utile de vous permettre d'être plus concis.

En tant que votre exemple montre, il vous permet d'écrire un « sûr » déclaration déréférencement en une ligne. Dans le cas contraire, vous devez faire quelque chose comme:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

semble trivial, mais essayez de codage dans une langue qui ne l'ont pas (par exemple VB6) et vous commencez à manquer cruellement il.

Il est dans les normes linguistiques que d'autres réponses mentionnent, mais seulement parce que quelque chose comme cela doit être clairement spécifiée. Qu'il peut éventuellement compiler jusqu'à code optimisé est un effet secondaire; ces jours-ci, un compilateur C ou de C décent compileraient les déclarations d'une ligne ou deux lignes equivilently

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top