Как данное условие if дает true в java
Я не могу понять, почему следующие блоки if выполняются. Как будут оцениваться условия if?
public class Test
{
public static void main(String[] args)
{
if (true || (false || true) && false)
{
System.out.println("How does this condition becomes true.");
}
if (false && (false || true) || true)
{
System.out.println("Same with this condition, why is it true.");
}
}
}
4 ответов
прежде всего, вы должны уже знать false || true
is true
.
кроме того, вы должны знать две другие вещи:
операторы && и | | "короткое замыкание", что означает, что они не оценивают правую сторону, если это не необходимо.
когда операторы равного приоритета появляются в том же выражении, правило должно управлять, которое вычисляется первым. Все бинарные операторы, за исключением операторов присваивания вычисляются слева направо; операторы присваивания вычисляются справа налево.
из таблицы приоритетов мы знаем &&
выше ||
.
Итак, в вашем вопросе, давайте сделаем основные рассуждения.
if (true / / (false / / true) & & false)
true || no_matter_what_is_in_right_side
будет true
, Итак, мы получили true
.
if (false & & (false || true) || true)
этот сложнее, чем предыдущий, на этот раз мы должны рассмотреть раздражает верх. Мы делаем рассуждения как:
false && no_matter_what_is_in_right_side
будет false
и все, что у нас осталось, это:
false || true
опять же у нас есть true
в конце.
но если вы уже заметили трюк: мы начинаем с правой true
тогда мы можем сделать рассуждение, как предыдущий непосредственно получить true
.
как упоминал Майкл, нам лучше использовать скобки, чтобы выразить точный порядок, а не полагаться на приоритет, который на самом деле трудно запомнить ##.
&&
имеет более высокий приоритет, чем ||
(источник). Поэтому добавление в parens, чтобы подчеркнуть, как они оцениваются:
if (true || ((false || true) && false))
// -------------^-------------------------^
и
if ((false && (false || true)) || true)
// -----^-------------------------^
как вы можете видеть, вы в конечном итоге с x || y
здесь x
is true
в первом примере, и y
правда во втором примере. Естественно как true || false
и false || true
are true
.
вы можете увидеть его в действии, используя метод, который выводит то, что он делает (скопировать видео) (помните, что как ||
и &&
короткое замыкание, то есть они не оценивают операнды, которые не могут изменить результат):
public class Test
{
private static boolean b(String label, boolean value) {
System.out.println(label + ": " + value);
return value;
}
public static void main(String[] args)
{
if (b("1", true) || (b("2", false) || b("3", true)) && b("4", false))
{
System.out.println("How does this condition becomes true.");
}
if (b("5", false) && (b("6", false) || b("7", true)) || b("8", true))
{
System.out.println("Same with this condition, why is it true.");
}
}
}
при запуске, что выводит:
1: true How does this condition becomes true. 5: false 8: true Same with this condition, why is it true.
используя ||
условие истинно, если хотя бы один операнд имеет значение true. Е. Г. false || true
результаты true
.
Итак, ваше первое условие истинно из-за первый настоящий (true || ...
.
if (true || (false || true) && false)
......|...............................
второе условие истинно из-за последняя ... || true)
if (false && (false || true) || true)
...................................|..
посмотри Таблица Истинности.
OR
P Q P||Q
--------------------
T F T
F T T
T T T
F F F
Ну посмотрим на первую строчку:
if (true || (false || true) && false)
на основе приоритета, все между ()
будет оцениваться первая. Итак, это будет false || true
, мы можем написать ||
as OR
, это означает, что мы получить true OR false
в таком случае это будет true
, поскольку одно из двух значений true
.
Хорошо, давайте двигаться дальше, это становится так:
if (true || true && false)
теперь мы подошли к запутанной части. В этом случае мы не читаем слева направо. Мы нужно взглянуть на &&
вместо ||
. Поэтому нам нужно проверить true && false
оценка, которая станет false
:
тогда мы остаемся со следующим утверждением:
if (true || false)
что будет true
конечно. То же самое происходит и со вторым.
см. Мор здесь:http://bmanolov.free.fr/javaoperators.php