Sim, exige isso (ordem de avaliação e curto-circuito). No seu exemplo, se todas as funções retornarem verdadeiras, a ordem das chamadas será estritamente de functionA, functionB e functionC. Usado para isso como
if(ptr && ptr->value) {
...
}
O mesmo para o operador de vírgula:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Diz-se entre o lado esquerdo e operando à direita de &&
, ||
, ,
e entre o primeiro e segundo / terceiro operando de ?:
(operador condicional) é um "ponto de sequência". Quaisquer efeitos colaterais são avaliados completamente antes desse ponto. Então, isso é seguro:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Observe que o operador de vírgula não deve ser confundido com a vírgula sintática usada para separar as coisas:
// order of calls to a and b is unspecified!
function(a(), b());
O padrão C ++ diz em 5.14/1
:
O operador && agrupa da esquerda para a direita. Os operandos são convertidos implicitamente no tipo bool (seção 4). O resultado é verdadeiro se ambos os operandos forem verdadeiros e falsos, caso contrário. Diferentemente de &, && garante a avaliação da esquerda para a direita: o segundo operando não é avaliado se o primeiro operando for falso.
E em 5.15/1
:
O || grupos de operadores da esquerda para a direita. Os operandos são implicitamente convertidos em bool (seção 4). Retorna true se um de seus operandos for true e false caso contrário. Ao contrário de |, || garante avaliação da esquerda para a direita; além disso, o segundo operando não será avaliado se o primeiro operando for avaliado como verdadeiro.
Diz para os dois próximos a esses:
O resultado é um bool. Todos os efeitos colaterais da primeira expressão, exceto a destruição de temporários (12.2), ocorrem antes que a segunda expressão seja avaliada.
Além disso, 1.9/18
diz
Na avaliação de cada uma das expressões
a && b
a || b
a ? b : C
a , b
usando o significado interno dos operadores nessas expressões (5.14, 5.15, 5.16, 5.18), existe um ponto de sequência após a avaliação da primeira expressão.