Как данное условие 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