Цитирование C11
, глава §6.5.14, (курсив мой )
В отличие от оператора побитового |
, то оператор ||
гарантии влево-вправо оценки; если вычисляется второй операнд , то существует точка последовательности между оценками первого и вторыми операндами. Если первый операнд сравнивается не равным 0
, второй операнд не оценивается.
Таким образом, в вашем случае,
d=a++||b++||c++
такая же, как
d= ((a++ || b++) || c++)
Тогда утверждение в первых скобках оценивается, первые a++
(пост-инкремент) вычисляется до 0 (ожидаемый побочный эффект), поэтому оценивается RHS первого ||
, b++
, производя 1 и результат операции ||
TRUE, дает 1.
Этот результат, 1
, является LHS второго ||
. Следовательно, RHS второго ||
(c++
) больше не оценивается, и конечный результат становится TRUE, снова приводя к 1
, который хранится в d
.
Таким образом, в конце концов,
a++
оценивается, становится 1
b++
оценивается, становится 2
c++
является не оценивали, остается 2
- результат
||
сохраняется в d
, то есть ИСТИНА, поэтому сохраняет 1.
С другой стороны, для логического элемента И &&
оператора,
[...] Если первый операнд сравнивает равен 0, второй операнд не вычисляется.
Так, если заменить последний ||
с &&
, то для внешнего оператора, то LHS становится 1 и РИТ оценивает, что делает c++
быть оценены и увеличивается, как побочный эффект.
@ Олаф Сэр, я почтительно не согласен. Это не обман, по крайней мере, не тот. –
@SouravGhosh: Возможно, вы правы, я могу пропустить. Не совсем ясно, что означает «и оператор» OP. Ваше редактирование подразумевает логическое «и», и я, как правило, соглашаюсь сейчас, но мы лучше попросили разъяснения от OP в первую очередь (вы до редактирования, я до дубля голосования). Я уверен, что есть еще один дубликат, но мой здесь действительно не так. – Olaf
это логический "и" –