Вывод следующей программы дан мне и ее просто не щелкают. Ответ 6 3, который мне явно не понятен - PullRequest
0 голосов
/ 01 сентября 2018
class ab {
    public static void main(String a[])
    {
        int x = 0, y = 0;

        for (int z = 0; z < 5; z++)
        {

            if (++x > 2 && ++y > 2)
            {
                x++;
            }
        }
        System.out.println(x + " " + y);
    }
}

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Если вы обнаружите, что считаете выводом 8 5, вы упускаете из виду тонкий факт:

if (++x > 2 && ++y > 2)

Оператор && является оператором короткого замыкания . Это означает, что правый операнд вычисляется только тогда, когда левый операнд имеет значение true.

Существует не короткое замыкание и оператор - & - который всегда оценивает оба; но это не то, что используется здесь. Если вы замените && на &, вы действительно получите 8 5. && и & дают логически тот же результат, если в оценке операндов нет побочных эффектов, поэтому && используется гораздо чаще (в той степени, что я не помню, когда в последний раз читал логическое значение *) 1017 * в реальном коде, не говоря уже о написании одного), потому что это позволяет избежать ненужной работы.

Итак, на первых 2 итерациях цикла x увеличивается без увеличения y.

После этого увеличивается x и y.

Вы могли бы найти это самостоятельно, используя отладчик, или просто распечатав значения x и y на каждой итерации цикла. Вы бы быстро нашли разницу по сравнению с работой на бумаге.

0 голосов
/ 01 сентября 2018

хорошо, это очень просто, давайте посмотрим в первый раз, когда цикл z = 0 for достигает оператора if, когда он сначала проверяет левую сторону, где ++i - предварительное увеличение, поэтому i становится 1 перед сравнением, а затем 1> 2 возвращает false , который не проверяет вторую часть.

Теперь z = 1 и снова предварительное увеличение и i = 2, что снова возвращает условие false , а y по-прежнему равно 0

Сейчас z = 2 и i = 3, которые 3>2, которые возвращают true сейчас и сейчас, будет предварительное увеличение на y и y=1, но возвращает false

Теперь z = 3 и i = 4, а затем y =2, которые снова возвращают 2>2 false

Теперь z= 4 и i = 5 и y = 3, и оба условия в операторах if возвращают true , и его тело выполняется, что означает увеличение поста по x и x будет x= 6

сейчас z = 5 и for возврат условия цикла ложь и цикл обрыв и наконец System.out.println(x + " " + y); дает 6 и 3

Примечание: , если условие выполняется только один раз

0 голосов
/ 01 сентября 2018

&& является оператором короткого замыкания, что означает, что ++y > 2 не будет оцениваться до тех пор, пока ++x не станет меньше 3. В этом случае мы можем тривиально добавить сообщения отладки, чтобы получить значения для x, y и z до и после блока if, чтобы увидеть точно , что происходит (и когда). Как,

int x = 0, y = 0;
for (int z = 0; z < 5; z++) {
    System.out.printf("Before: x = %d, y = %d, z = %d%n", x, y, z);
    if (++x > 2 && ++y > 2) {
        System.out.printf("Inside: x = %d, y = %d, z = %d%n", x, y, z);
        x++;
    }
    System.out.printf("After:  x = %d, y = %d, z = %d%n", x, y, z);
}
System.out.println(x + " " + y);

Что, надеюсь, прояснит любую оставшуюся путаницу

Before: x = 0, y = 0, z = 0
After:  x = 1, y = 0, z = 0
Before: x = 1, y = 0, z = 1
After:  x = 2, y = 0, z = 1
Before: x = 2, y = 0, z = 2
After:  x = 3, y = 1, z = 2
Before: x = 3, y = 1, z = 3
After:  x = 4, y = 2, z = 3
Before: x = 4, y = 2, z = 4
Inside: x = 5, y = 3, z = 4
After:  x = 6, y = 3, z = 4
6 3
...