@alexunder

Задан ли порядок проверки условий в составном условном операторе if-else?

Пусть есть составной условный оператор
if (A || B || C) {
...}
Задана ли жестко последовательность, в которой будут проверяться условия A, B, C? Поделитесь ссылкой, пожалуйста, где почитать в javadoc.
  • Вопрос задан
  • 6288 просмотров
Решения вопроса 1
cypok
@cypok
The conditional-or operator is syntactically left-associative (it groups left-to-right).
At run-time, the left-hand operand expression is evaluated first; if the result has type Boolean, it is subjected to unboxing conversion (§5.1.8).
If the resulting value is true, the value of the conditional-or expression is true and the right-hand operand expression is not evaluated.

Java Language Specification, Chapter 15. Expressions
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@BrainHacker
Не знаю, где об этом почитать в javadoc, но порядок жестко задан: сначала проверяется A, затем B, затем C.
И вот для чего это сделано: если А верно, то нет смысла проверять В и С.
Аналогично для условия (A && B && C): если А ложно, то нет смысла проверять В и С.

Это удобно, так как можно писать красивые условия. К примеру, если в случае (A || B || C) проверка В при условии А ложно приведет к исключению, то проверка условия (A || B || C) не приведет к исключению, из-за особенности, которую я описал выше.
Ответ написан
megahertz
@megahertz
full stack разработчик
Слева на право, как и в любых С подобных языках, если какой-то оператор не имеет больший приоритет.
Ответ написан
Комментировать
@b0noII
ну и само собой если || то проверяет до первого true, а если && то до первого false
Ответ написан
Комментировать
eaa
@eaa
Зависит от компилятора. В старом добром паскале у борланда был специальный ключ, который задавал так называемые «полные» проверки условий, т.е. даже если для условия (A or B) A истинно и по идее не надо вычислять B, при явном указании полных вычислений B тоже вычислится. Сталкивался с этим, потому что у меня из-за этого падали программки, когда мне нельзя было вычислять B при A==false (например деление на 0).
Ответ написан
barker
@barker
Вопрос про Java, так что никак не может «зависеть от компилятора». Любой «компилятор» и jvm обязан одинаково работать, как и написано в спецификации, ссылка дана выше. Вычисляется слева направо, для операторов || и && неполные проверки условий. Для операторов & и | — полные. Тут и обсуждать больше нечего :)
Ответ написан
@alexunder Автор вопроса
Всем спасибо за ответы, очень оперативно!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы