Oui, cela l'exige (ordre d'évaluation et court-circuit). Dans votre exemple, si toutes les fonctions retournent true, l'ordre des appels est strictement à partir de functionA puis functionB puis functionC. Utilisé pour cela comme
if(ptr && ptr->value) {
...
}
Idem 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 le premier et le deuxième / troisième opérande ?:
(opérateur conditionnel) est un « point de séquence ». Tous 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 ne doit pas être confondu avec la virgule syntaxique utilisée pour séparer les choses:
// order of calls to a and b is unspecified!
function(a(), b());
La norme C ++ dit dans 5.14/1
:
L'opérateur && regroupe de gauche à droite. Les opérandes sont tous deux implicitement convertis en type bool (clause 4). Le résultat est vrai si les deux opérandes sont vrai et faux dans le cas contraire. Contrairement à &, && garantit une évaluation de gauche à droite: le deuxième opérande n'est pas évalué si le premier opérande est faux.
Et dans 5.15/1
:
Le || groupes d'opérateurs de gauche à droite. Les opérandes sont tous deux implicitement convertis en booléen (clause 4). Il renvoie vrai si l'un de ses opérandes est vrai et faux dans le cas contraire. Contrairement à |, || garantit une évaluation de gauche à droite; de plus, le deuxième opérande n'est pas évalué si le premier opérande est évalué à vrai.
Il 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, à l'exception de la destruction des temporaires (12.2), se produisent avant que la seconde expression ne soit évaluée.
En plus de cela, 1.9/18
dit
Dans l'évaluation de chacune des expressions
a && b
a || b
a ? b : C
a , b
en utilisant la signification intégrée 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.