Нашлось подходящее место в
стандарте:
пункт 7.6.15 писал(а):
Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.
The result is a bool. If the second expression is evaluated, every value computation and side effect associated with the first expression is sequenced before every value computation and side effect associated with the second expression.
Тогда вопрос сводится к следующему: может ли быть побочный эффект без вычисления значения подвыражения?
Вообще-то, насколько мне известно, это стандарт. Не стандарт «логики вычисления выражений», а стандарт операций || и &&, только и всего.
Тоже важный момент. Авторы (конкретно Николас Солтер и Скотт Клепер) утверждают, что это относится к любым выражениям вообще. Я проверил. Не относится:
#include <iostream>
using namespace std;
int f(){
cout<<"Test";
return 19;
}
int main() {
int test = 0 * (0 % f());
return 0;
}
Программа выводит слово, хотя значение выражения в целом можно предугадать без вычисления значений всех подвыражений.