Logiques ET, OU: Est de gauche à droite de l'évaluation de la garantie?
Est de gauche à droite de l'évaluation des opérateurs logiques (&&
||
) garanti?
Disons que j'ai ceci:
SDL_Event event;
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
//do stuff
}
}
Est-ce garanti d'être le même que celui de la?
SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
//do stuff
}
Cela peut aussi être très important, disons que nous avons deux exigences, a
et b
. Exigence a
est beaucoup plus susceptible d'échouer alors b
. Ensuite, il est plus efficace de dire if (a && b)
que if (b && a)
.
- Un classique, l'utilisation importante pour le séquençage de l'implicite par
&&
est de tester des pointeurs null avant de l'utiliser:if (a != 0 && a->b != 0 && a->b->c != 0) { somefunc(a->b->c->d); }
. La séquence est essentielle pour éviter les vidages mémoire. (Et je suis ignorant la Loi de Déméter pour l'application de l'exposition!) - Je l'ignore pour le but d'obtenir le travail fait!
- Ce ne sont pas des opérateurs de comparaison.
Vous devez vous connecter pour publier un commentaire.
Oui, c'est la garantie, sinon ils perdraient beaucoup de leur utilité.
Avis Important: ceci est valable seulement pour la builtin
&&
et||
; si certains criminels surcharges, ils sont traités comme des "réguliers" surcharge des opérateurs binaires, donc dans ce cas les deux opérandes sont toujours évalué, et dans un ordre non spécifié comme d'habitude. Pour cette raison, ne surchargez jamais les pauses d'un très important hypothèse sur le flux de contrôle du programme.Norme pertinente citations
Builtin
&&
et||
avoir la garantie d'un court-circuit comportement§5.14 ¶1
§5.15 ¶1
En cas de surcharge, ils se comportent comme des "réguliers" des opérateurs binaires (pas de court-circuit ou de la garantie de la commande de l'évaluation)
§13.5 ¶9
et
&&
et||
ne sont pas explicitement mentionnés dans ces paragraphes, de manière régulière §13.5.2 détient:§13.5.2 ¶1
avec pas de disposition particulière pour l'évaluation d'un seul côté ou dans un ordre particulier.
(toutes les citations de C++11)
a
etb
étaient hypothétiques. Ils pourraient avoir étéIsPrime(n)
etIsEven(n)
, dans lequel l'ordre est assez évident et grave des économies peuvent être faites.operator&&
ouoperator||
puis il est traité comme un appel de fonction, et la gauche-à-droite de l'évaluation n'est plus garantie.[