Порядок булева выражения оценки в Java?

Предположим, что у меня есть следующее выражение

String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}

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

27
задан daveslab 8 January 2010 в 15:49
поделиться

4 ответа

Однако я знаю, что некоторые компиляторы выйдут на логическое выражение целиком, если первое условие не удается. Это правда с java?

Да, что известно как Оценка короткого замыкания . Uperators, как && и || являются операторами, которые выполняют такие операции.

Или это порядок оценки не гарантирован?

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

46
ответ дан 28 November 2019 в 04:56
поделиться

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

.
1
ответ дан 28 November 2019 в 04:56
поделиться

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

Да, это называется Оценка короткого замыкания .Операторы, такие как & & и | | , являются операторами, выполняющими такие операции.

Или порядок оценки не гарантирован?

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

-121--1414208-

Visual Studio не имеет интегрированной системы документации.

Если вы хотите сохранить совместимость с другими языками, попробуйте использовать Doxygen с Doxycomment Addin для Visual Studio.

Для документации C # или .NET существует несколько инструментов, наиболее часто используемых (насколько мне известно) - Замки из песка .

Наконец, вы можете проверить эту запись блога , которая предоставляет небольшой скрипт Python, который преобразует некоторые специальные тэги C # в Doxygen.

-121--1088516-

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

2
ответ дан 28 November 2019 в 04:56
поделиться

Java следует оценивать ваши заявления слева направо. Он использует механизм, известный как Оценка короткого замыкания , чтобы предотвратить тестирование второго, третьего, третьего и N-я, если первое - это ложь.

Итак, если ваше выражение MyContainer! = Null && mycontainer.contains (myObject) и MyContainer - это NULL, второе условие, MyContainer.Contains (MyObject) не будет оценено.

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

7
ответ дан 28 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

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