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