Да, это требует (и порядок оценки, и короткое замыкание). В вашем примере, если все функции возвращают истину, порядок вызовов строго от functionA, затем functionB и затем functionC. Используется для этого как
if(ptr && ptr->value) {
...
}
То же самое для оператора запятой:
int c = (a(), b());
Один говорит между левым и правым операндом &&
, ||
, ,
и между первым и вторым / третьим операндом ?:
(условного оператором) является «точкой последовательности». Любые побочные эффекты полностью оцениваются до этого момента. Итак, это безопасно:
int a = 0;
int b = (a++, a);
Обратите внимание, что оператор запятой не следует путать с синтаксической запятой, используемой для разделения вещей:
function(a(), b());
Стандарт C ++ гласит 5.14/1
:
Группы операторов && расположены слева направо. Оба операнда неявно преобразуются в тип bool (пункт 4). Результат истинен, если оба операнда истинны, и ложь в противном случае. В отличие от &, && гарантирует оценку слева направо: второй операнд не оценивается, если первый операнд ложен.
И в 5.15/1
:
|| группы операторов слева направо. Оба операнда неявно преобразуются в bool (раздел 4). Он возвращает истину, если один из его операндов истинен, и ложь в противном случае. В отличие от |, || гарантирует оценку слева направо; более того, второй операнд не оценивается, если первый операнд имеет значение true.
Он говорит для обоих рядом с этими:
Результат - bool. Все побочные эффекты первого выражения, за исключением разрушения временных файлов (12.2), происходят до того, как будет вычислено второе выражение.
В дополнение к этому, 1.9/18
говорит
При оценке каждого из выражений
a && b
a || b
a ? b : C
a , b
используя встроенное значение операторов в этих выражениях (5.14, 5.15, 5.16, 5.18), после вычисления первого выражения есть точка последовательности.