Sí, lo exige (tanto el orden de evaluación como el cortocircuito). En su ejemplo, si todas las funciones devuelven verdadero, el orden de las llamadas es estrictamente de la función A, luego la función B y luego la función C. Utilizado para esto como
if(ptr && ptr->value) {
...
}
Lo mismo para el operador de coma:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Se dice entre la izquierda y operando de la derecha de &&
, ||
, ,
y entre la primera y la segunda / tercera operando de ?:
(operador condicional) es un "punto de secuencia". Cualquier efecto secundario se evalúa completamente antes de ese punto. Entonces, esto es seguro:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Tenga en cuenta que el operador de coma no debe confundirse con la coma sintáctica utilizada para separar las cosas:
// order of calls to a and b is unspecified!
function(a(), b());
El estándar C ++ dice en 5.14/1
:
El operador && se agrupa de izquierda a derecha. Los operandos se convierten implícitamente a tipo bool (cláusula 4). El resultado es verdadero si ambos operandos son verdaderos y falsos de lo contrario. A diferencia de &, && garantiza la evaluación de izquierda a derecha: el segundo operando no se evalúa si el primer operando es falso.
Y en 5.15/1
:
El || grupos de operadores de izquierda a derecha. Los operandos se convierten implícitamente a bool (cláusula 4). Devuelve verdadero si alguno de sus operandos es verdadero, y falso de lo contrario. A diferencia de |, || garantiza la evaluación de izquierda a derecha; además, el segundo operando no se evalúa si el primer operando se evalúa como verdadero.
Dice para ambos al lado de aquellos:
El resultado es un bool. Todos los efectos secundarios de la primera expresión, excepto la destrucción de los temporales (12.2) ocurren antes de evaluar la segunda expresión.
Además de eso, 1.9/18
dice
En la evaluación de cada una de las expresiones.
a && b
a || b
a ? b : C
a , b
utilizando el significado incorporado de los operadores en estas expresiones (5.14, 5.15, 5.16, 5.18), hay un punto de secuencia después de la evaluación de la primera expresión.