2010-01-08 2 views
26

Предположим, у меня есть следующее выражениеБулевский порядок выражения в Java?

Eclipse, предупреждает меня, что myString может быть пустым во второй фразе логического выражения. Однако я знаю, что некоторые компиляторы полностью выходят из логического выражения, если первое условие выходит из строя. Это правда с Java? Или порядок оценки не гарантируется?

+0

Какой компилятор или инструмент вы используете? – notnoop

+0

Зачем это важно? – danben

+0

Ну, javac (самый распространенный компилятор) не предупреждает об исключении. Если «Java предупреждает меня, что myString может быть пустым», скорее всего это инструмент с ошибкой. Нет такой вещи, как «java warns». – notnoop

ответ

44

Однако, я знаю, что некоторые компиляторы полностью выходят из булевого выражения, если первое условие терпит неудачу. Это правда с Java?

Да, что известно как Short-Circuit evaluation .Operators как && и || операторы, которые выполняют такие операции.

Или это оценка не гарантируется?

Нет, порядок оценки гарантируется (слева направо)

1

Да, Java использует ленивую оценку утверждений if таким образом. если myString == null, остальная часть оператора if не будет оценена

7

Java должен оценивать ваши заявления слева направо. Он использует механизм, известный как short-circuit evaluation, для предотвращения проверки второго, третьего и n-го условий, если первый является ложным.

Итак, если ваше выражение myContainer != null && myContainer.Contains(myObject) и myContainer равно null, второе условие, myContainer.Contains(myObject) не будет оцениваться.

Редактировать: Как уже упоминалось, Java, в частности, имеет как короткозамкнутые, так и некороткозамкнутые операторы для булевых условий. Использование && вызовет оценку короткого замыкания, а & не будет.

+1

Цитирование: 'Для предотвращения проверки второго, третьего и n-го условий, если первое ложно'. На самом деле, если оператор '||', компилятор не может заключить общее значение из первого, если первое ложно. – H2ONaCl

2

Джеймс и Ed правильны. Если вы сталкиваетесь с ситуацией, в которой вы хотите, чтобы все выражения были оценены независимо от предыдущих неудачных условий, вы можете использовать логический оператор с недолгосрочным замыканием &.

Смежные вопросы