Oui, c'mandats (à la fois l'ordre d'évaluation et de court-circuit). Dans votre exemple, si toutes les fonctions renvoient vrai, l'ordre des appels sont strictement de functionA puis functionB et puis functionC. Utilisé comme
if(ptr && ptr->value) {
...
}
De même pour l'opérateur virgule:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
On dit entre la gauche et la droite opérande &&
, ||
, ,
et entre la première et la deuxième/troisième opérande ?:
(opérateur conditionnel) est un "point de séquence". Les effets secondaires sont évalués complètement avant ce point. Donc, c'est sûr:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Notez que l'opérateur virgule n'est pas à confondre avec la syntaxe utilisé par des virgules pour séparer les choses:
// order of calls to a and b is unspecified!
function(a(), b());
La Norme C++, dit en 5.14/1
:
Le && opérateur de groupes de gauche à droite. Les opérandes sont à la fois implicitement converti vers le type bool (clause 4).
Le résultat est true si les deux opérandes sont true et false sinon. Contrairement &, && garanties de gauche à droite
évaluation: le deuxième opérande n'est pas évalué si le premier opérande est faux.
Et dans 5.15/1
:
L'opérateur || groupes de gauche à droite. Les opérandes sont à la fois implicitement converti en booléen (clause 4). Elle retourne true si l'une des opérandes est vrai, et faux sinon. À la différence de |, || les garanties de gauche à droite de l'évaluation; de plus, le deuxième opérande n'est pas évalué si le premier opérande est évaluée à true.
Il est dit pour les deux à côté de ceux-ci:
Le résultat est un booléen. Tous les effets secondaires de la première expression, sauf pour la destruction des temporaires (12.2) arrivera pas avant la deuxième expression est évaluée.
En outre, 1.9/18
dit
Dans l'évaluation de chacune des expressions
a && b
a || b
a ? b : C
a , b
en utilisant le haut-sens des opérateurs dans ces expressions (5.14, 5.15, 5.16, 5.18), il y a un point de séquence après l'évaluation de la première expression.