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

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

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

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

Ответ 1

Операторы || и && закорочены.

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

Ответ 2

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

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

&& and ||

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

& and |

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

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

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

Java будет:

  • Сначала проверьте, isVeryLicious() возвращает true. Если это правда, то это будет не продолжать дальше.
  • Если isVeryLicious() возвращает false, затем вызовите isSomewhatLicious(), чтобы посмотрите, вернет ли он true. Если правда, ничего другого, если оценивается. Если false, goto 3.
  • isHardlyLicious() вызывается. Если true, полное выражение истинно, в противном случае - false выражение false.

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

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

Ответ 3

Нет, java использует оценку короткого замыкания в выражениях с использованием || и &&. Подробнее см. здесь.

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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