Ответ 1
Нет. В C есть точка последовательности между оценкой LHS оператора &&
и оценкой RHS, а приращение должно выполняются и выполняются до оценки RHS. Таким образом, выполняется i++
(эквивалентно i++ != 0
), и инкремент завершается (и выражение оценивается как true), поэтому к моменту оценки RHS i == 2
и, следовательно, общее выражение ложно, и вы получите "Нет". Если LHS оператора &&
оценивается как false (0), RHS не будет оцениваться из-за свойства "короткого замыкания" оператора &&
.
Только несколько операторов обладают свойством иметь точку последовательности между оценкой LHS и RHS: &&
, ||
и ,
(как оператор, а не как разделитель в списке аргументов) - и там ? :
тоже, который не является двоичным оператором, но имеет точку последовательности после вычисления условия и перед тем, как оценивается выражение после ?
или выражение после :
(из которого один или другой, но не оба, всегда оцениваются).
Операторы &&
и ||
являются единственными операторами с свойством "короткого замыкания". RHS &&
оценивается только в том случае, если LHS оценивается как true; RHS ||
оценивается только в том случае, если LHS оценивает значение false.
Уточнение в точках последовательности
Iwillnotexist Idonotexist правильно утвердил:
Стандарт C11 не покончил с точками последовательности, только стандарт С++ 11 сделал.
С++ 11 (ISO/IEC 14882: 2011) гласит:
1.9 Выполнение программы
¶13. Сегментированное ранее - асимметричное, транзитивное, парное отношение между оценками, выполненными одним (1.10), что вызывает частичный порядок среди этих оценок. При любых двух оценках A и B, если A секвенируется до B, тогда выполнение A должно предшествовать исполнению B. Если A не секвенировано до B и B не секвенированы до A, тогда A и B не подвержены влиянию. [Примечание: Выполнение непересекающихся оценки могут перекрываться. -end note] Оценки A и B неопределенно секвенированы, когда либо A секвенируется до того, как B или B секвенированы до A, но не указано, что. [Примечание: неопределенно секвенированные оценки не могут пересекаться, но либо могут быть выполнены в первую очередь. -end note]
Термин "точка последовательности" вообще не отображается в С++ 11 (единственное совпадение - "указатель последовательности" ).
C11 (ISO/IEC 9899: 2011) гласит:
5.1.2.3 Выполнение программы
¶3. Сегментированное ранее - асимметричное, транзитивное, парное отношение между оценками выполненный одним потоком, который вызывает частичный порядок среди этих оценок. При любых двух оценках A и B, если A секвенирован до B, то выполнение A предшествует исполнению B. (Наоборот, если A секвенировано до B, то B является последовательность после A.) Если A не секвенируется до или после B, то A и B являются unsequenced. Оценки A и B неопределенно секвенированы, когда A секвенирован либо до, либо после B, но не указано, что. 13). Наличие точки последовательности между оценкой выражений A и B следует, что каждое вычисление значения и побочный эффект, связанный с А, секвенирован перед вычислением каждого значения и побочным эффектом связанных с B. (Краткое описание точек последовательности приведено в приложении C.)
13) Выполнение неэфференцируемых оценок может чередовать. Неопределенно упорядоченные оценки не может перемежаться, но может выполняться в любом порядке.
Итак, C11 сохраняет точки последовательности, но добавляет "секвенированные ранее" и связанные термины, используя, по существу, ту же терминологию, что и С++ 11.