Ответ 1
Да, это гарантировано, в противном случае такие операторы потеряли бы большую часть своей полезности.
Важное примечание: это справедливо только для встроенных &&
и ||
; если некоторые преступники перегружают их, они рассматриваются как "обычные" перегруженные двоичные операторы, поэтому в этом случае оба операнда всегда оцениваются и в неуказанном порядке, как обычно. По этой причине никогда не перегружайте их - это нарушает чрезвычайно важное предположение о потоке управления программой.
Соответствующие стандартные котировки
Встроенные &&
и ||
имеют гарантированное поведение короткого замыкания
§5.14 ¶1
В отличие от
&
,&&
гарантирует оценку слева направо: второй операнд не оценивается, если первый операндfalse
.
§5.15 ¶1
В отличие от
|
,||
гарантирует оценку слева направо; кроме того, второй операнд не оценивается, если первый операнд оценивается доtrue
.
Если они перегружены, они ведут себя как "обычные" двоичные операторы (без короткого замыкания или гарантированного порядка оценки)
§13.5 ¶9
Операторы, не указанные явно в подпунктах 13.5.3 - 13.5.7, действуют как обычные унарные и двоичные операторы, подчиняющиеся правилам 13.5.1 или 13.5.2.
и &&
и ||
не указаны явно в этих подпунктах, поэтому имеет место регулярный §13.5.2:
§13.5.2 ¶1
Двоичный оператор должен быть реализован либо нестатической функцией-членом (9.3) с одним параметром, либо не-членной функцией с двумя параметрами. Таким образом, для любого двоичного оператора
@
,[email protected]
можно интерпретировать как либо[email protected](y)
, либо[email protected](x,y)
.
без специального положения для оценки только одной стороны или в определенном порядке.
(все цитаты из стандарта С++ 11)