Подтвердить что ты не робот

Логическое И, ИЛИ: гарантирована ли оценка слева направо?

Гарантируется ли левая-правовая оценка логических операторов (&& ||)?

Скажем, у меня есть это:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}

Гарантировано ли это как это?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}

Это также может быть очень важно, допустим, у нас есть два требования: a и b. Требование a гораздо с большей вероятностью завершится неудачей, чем b. Тогда более эффективно говорить if (a && b), чем if (b && a).

4b9b3361

Ответ 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)