Sì, impone questo (sia l'ordine di valutazione che il corto circuito). Nel tuo esempio se tutte le funzioni ritornano vere, l'ordine delle chiamate è rigorosamente dalla funzione A, quindi dalla funzione B e quindi dalla funzione C. Usato per questo tipo
if(ptr && ptr->value) {
...
}
Lo stesso per l'operatore virgola:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Si dice tra destra e sinistra operando di &&
, ||
, ,
e tra la prima e seconda / terza operando ?:
(operatore condizionale) è un "punto sequenza". Tutti gli effetti collaterali vengono valutati completamente prima di quel punto. Quindi, questo è sicuro:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Nota che l'operatore virgola non deve essere confuso con la virgola sintattica usata per separare le cose:
// order of calls to a and b is unspecified!
function(a(), b());
Lo standard C ++ dice in 5.14/1
:
L'operatore && raggruppa da sinistra a destra. Gli operandi vengono entrambi implicitamente convertiti in tipo bool (clausola 4). Il risultato è vero se entrambi gli operandi sono veri e falsi altrimenti. A differenza di &, && garantisce la valutazione da sinistra a destra: il secondo operando non viene valutato se il primo operando è falso.
E in 5.15/1
:
Il || gruppi di operatori da sinistra a destra. Gli operandi sono entrambi implicitamente convertiti in bool (clausola 4). Restituisce vero se uno dei suoi operandi è vero e falso altrimenti. A differenza di |, || garantisce la valutazione da sinistra a destra; inoltre, il secondo operando non viene valutato se il primo operando viene valutato come vero.
Dice per entrambi accanto a quelli:
Il risultato è un bool. Tutti gli effetti collaterali della prima espressione tranne la distruzione dei provvisori (12.2) si verificano prima che la seconda espressione venga valutata.
Inoltre, 1.9/18
afferma
Nella valutazione di ciascuna delle espressioni
a && b
a || b
a ? b : C
a , b
usando il significato incorporato degli operatori in queste espressioni (5.14, 5.15, 5.16, 5.18), c'è un punto di sequenza dopo la valutazione della prima espressione.