Java приращение логической задачи (приращение в условных выражениях) - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть эта оценка, которая мне дана, но эти два вопроса застряли у меня в голове. Эти два кода кажутся похожими, но дают разные выходные данные, основанные на приращении

Код # 1:

package com.company;
class Main {
public static void main(String [] args) {
                boolean x = true;
                boolean y = false;
                short z = 42;

                if((z++ == 42) && (y = true))
                    z++;
                if((x = false) || (++z == 45))
                    z++;
                System.out.println("z = " + z);
                }
}

Этот код казался хорошим, он увеличивает значение, которое он должен увеличивать, и возвращает это значение "z", таким образом, вывод

Вывод:

z = 46

Process finished with exit code 0

Но второй код выглядел иначе, поскольку он не сохраняет увеличенное значение

Код # 2: пакет com.company;

publi c class Test2

{
    public static void main(String [] args) {
        boolean x = true;
        boolean y = false;
        short z = 42;
        if((x == true) && (y = true))
            z++;
        if((y == true) || (++z == 44))
            z++;
        System.out.println("z = " + z);
    }
}

Это не сохраняет приращение на втором, если условный оператор, как первый код

Вывод:

z = 44

Process finished with exit code 0

Я что-то упустил?

1 Ответ

2 голосов
/ 16 апреля 2020

Это связано с тем, что логический оператор ИЛИ (||) имеет значение короткое замыкание : если известно, что первое условие истинно, то второе условие вообще не выполняется .

Это означает, что z++ в (++z == 44) не выполняется, следовательно, конечный результат равен 44 вместо 45.

Как упоминалось в комментариях, поразрядно Оператор ИЛИ (|) не имеет короткого замыкания, поэтому оба оператора всегда выполняются.


Подобный код может быть очень запутанным. Код должен быть в первую очередь читабельным. Никогда не используйте назначение в условии. b = false можно легко спутать с b == false. Также избегайте использования операторов приращения в середине других операций, только как автономные выражения.

...