Оценивает ли Java оставшиеся условия после того, как известен логический результат?

То есть, если у меня есть оператор, который оценивает несколько условий, скажем, оператор 'или', например, так...

if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
    ...
}

В том случае, если isVeryLikely() возвращает true во время выполнения, будет isSomewhatLikely() а также isHardlyLikely() выполнить? Как насчет того, чтобы вместо методов они были статическими логическими значениями?

6 ответов

Решение

|| а также && операторы замкнуты.

true || willNeverExecute();
false && willNeverExecute();

Первое, что вам нужно отметить, это то, что условные операторы Java могут принимать только логические значения, в отличие от других языков, таких как C/C++, где любое ненулевое значение будет иметь значение true.

При этом существует 2 типа операторов, первый из которых известен как типы короткого замыкания:

&& and ||

в то время как другие типы без короткого замыкания:

& and |

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

Имея это в виду, что у вас есть:

if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
    ...
}

Java будет:

  1. Сначала проверьте, возвращает ли isVeryLikely() значение true. Если это правда, то это не будет продолжаться дальше.
  2. Если isVeryLikely() возвращает false, тогда вызывайте isSomewhatLikely(), чтобы увидеть, возвращает ли он true. Если это правда, ничего больше, если оценивается. Если false, перейдите к 3.
  3. isHardlyLikely () вызывается. Если true, все выражение true, иначе false, все выражение false.

Вся концепция, о которой вы спрашиваете: "Как Java оценивает логические выражения". Хороший вопрос:)

Надеюсь, поможет! Ура!

Нет, Java использует оценку короткого замыкания в выражениях, использующих || а также &&, Смотрите здесь для получения дополнительной информации.

Потому что || в случае короткого замыкания, оператор будет оценен как истинный, как только он достигнет первого истинного условия, независимо от того, являются ли операнды статическими.

Короче говоря, никакие две другие функции не будут оцениваться, если первая вернет true.

В качестве обновления для пользователей Kotlin вы можете использовать оператор 'или' в библиотеке Kotlin std, чтобы проверить все выражения в операторе if и не выполнять короткое замыкание.

В выражении, представленном в исходном вопросе, код на Kotlin должен быть:

if(isVeryLikely() or isSomewhatLikely() or isHardlyLikely()) {
    ...
}

Краткий ответ: он будет оценивать, пока не будет достаточно, чтобы сделать вывод, является ли он T/F.

Существует то, что называется логическим коротким замыканием. По сути, он будет пытаться оценить только то, что ему нужно (если вы используете операторы && или ||) и отпуск. Вы можете воспользоваться этим несколькими способами:

(a() || b())
  1. Если b() выдаст исключение, если a() истинно, то он даже не попытается проверить b(). Тип механизма проверки цепи.

  2. Если последние оценки требуют ресурсов, вы можете переместить их в конец оценки (например, b() занимает в 10 раз больше времени)

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

Независимо от того, являются ли логические выражения, указанные в вопросах, статическими логическими значениями, или они являются методами, возвращающими логическое значение, в обоих случаях - оценка выражения начнется слева и условия будут оцениваться один за другим. Первое условие, которое дает значение true, приведет к короткому замыканию оценки. Он будет напрямую давать результат как истинный, а остальные условия не будут оцениваться. Вот как ||(ИЛИ) работает в Java, используя концепцию оценки короткого замыкания.

Если вы хотите больше узнать о коротких замыканиях в целом, вы можете обратиться к статье, которую я написал в своем блоге - http://www.javabrahman.com/programming-principles/short-circuiting-or-short-circuits-in-boolean-evaluations-in-programming-and-java/

Другие вопросы по тегам