За C ++ 03, стандарт гласит, что между левым и правым операндом && У оператора есть точка последовательности, так что все побочные эффекты левого оператора имели место до того, как был получен доступ к правому оператору.
Так
int i = 0;
if (++i && i--)
std::cout << i;
хорошо определен и гарантированно выведет 0
,
Но что об этом вопросе: правый операнд оценивается только если левый операнд не 0
? Кажется, это деталь, но для меня стандарт гарантирует только точку последовательности между операндами, не этот правильный операнд никогда не оценивается / не доступен в зависимости левого
Например.
int arr[10];
int pos; // somehow set to a value from 0 to 10
while (pos < 10 && arr[pos] != 0)
pos++;
Это хорошо определено? pos
может быть с самого начала 10
или достигает 10
, Левый операнд имеет нет побочные эффекты, которые совпадают с правым операндом. Есть ли у меня гарантия, что arr[10] != 0
никогда не выполняется?
Редактировать:
Благодаря комментариям и ответам теперь ясно:
5.14p2: "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."
является смыслом точки последовательности.
5.14p1: "Unlike &, && guarantees left-to-right evaluation: the second operand is
not evaluated if the first operand is false."
это значение короткого замыкания.
Первое без второго сделало бы мой пример неопределенным. Благодарю.
5.14p1 в C ++ 11, последнее предложение:
В отличие от &, && гарантирует оценку слева направо: второй операнд не оценивается, если первый операнд является ложным.
Так что да, это гарантировано.
Стандарт гарантирует короткое замыкание &&
а также ||
,
Если левая сторона &&
является false
правая часть не оценивается. За ||
правая сторона не оценивается, если левая сторона true
,