Java 下面程序的输出给了我,只是没有点击。答案是63,我显然不明白

Java 下面程序的输出给了我,只是没有点击。答案是63,我显然不明白,java,output,increment,decrement,Java,Output,Increment,Decrement,&&是短路运算符,这意味着在++x至少为3之前,不会计算++y>2。在这种情况下,我们可以简单地添加调试消息,以获取if块前后的x、y和z值,从而准确地了解发生了什么以及何时发生。像 class ab { public static void main(String a[]) { int x = 0, y = 0; for (int z = 0; z < 5; z++) { if (++x >

&&是短路运算符,这意味着在++x至少为3之前,不会计算++y>2。在这种情况下,我们可以简单地添加调试消息,以获取if块前后的x、y和z值,从而准确地了解发生了什么以及何时发生。像

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);
    }
}
&&是短路运算符,这意味着在++x至少为3之前,不会计算++y>2。在这种情况下,我们可以简单地添加调试消息,以获取if块前后的x、y和z值,从而准确地了解发生了什么以及何时发生。像

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);
    }
}

如果您发现您认为输出为85,那么您忽略了一个微妙的事实:

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
&&运算符是短路运算符。这意味着只有当左侧操作数为真时,才计算右侧操作数

有一个非短路和运算符-&-始终对两者进行评估;但这不是这里所用的。如果你用&&替换&,你确实会得到8.5&&如果操作数的求值没有副作用,&在逻辑上给出相同的结果,因此&&的使用频率要高得多,以至于我不记得上次读布尔值的时候了&在实际代码中,更不用说写布尔值了,因为它避免了不必要的工作

因此,在循环的前2次迭代中,x增加而不增加y

之后,x和y都递增


您可以通过使用调试器,或者只是在每个循环迭代中打印出x和y的值,自己发现这一点。你很快就会发现与纸上工作的区别。

如果你发现你认为输出是85,那么你忽略了一个微妙的事实:

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
&&运算符是短路运算符。这意味着只有当左侧操作数为真时,才计算右侧操作数

有一个非短路和运算符-&-始终对两者进行评估;但这不是这里所用的。如果你用&&替换&,你确实会得到8.5&&如果操作数的求值没有副作用,&在逻辑上给出相同的结果,因此&&的使用频率要高得多,以至于我不记得上次读布尔值的时候了&在实际代码中,更不用说写布尔值了,因为它避免了不必要的工作

因此,在循环的前2次迭代中,x增加而不增加y

之后,x和y都递增


您可以通过使用调试器,或者只是在每个循环迭代中打印出x和y的值,自己发现这一点。你很快就会发现与纸上工作的区别。

好的,很简单,让我们看看 第一次当if语句的循环到达z=0时,它首先检查左侧,其中++i是预增量,因此在比较之前我变为1,然后1>2返回false,该值不检查第二部分

现在z=1,再次预递增,i=2,条件再次返回false,y仍然为0

现在z=2和i=3,其中3>2现在返回真值,现在在y和y=1处会有预增量,但返回假值

现在z=3,i=4,然后y=2,再次返回2>2 false

现在z=4,i=5,y=3,if语句中的两个条件都返回true,其主体执行,这意味着x和x中的后增量将为x=6

现在z=5,对于循环条件,返回false和循环中断 最后是System.out.printlnx++y;给出6和3


注意:如果条件只执行一次

ok,那么很简单,让我们看一下 第一次当if语句的循环到达z=0时,它首先检查左侧,其中++i是预增量,因此在比较之前我变为1,然后1>2返回false,该值不检查第二部分

现在z=1,再次预递增,i=2,条件再次返回false,y仍然为0

现在z=2和i=3,其中3>2现在返回真值,现在在y和y=1处会有预增量,但返回假值

现在z=3,i=4,然后y=2,再次返回2>2 false

现在z=4,i=5,y=3,if语句中的两个条件都返回true,其主体执行,这意味着x和x中的后增量将为x=6

现在z=5,对于循环条件,返回false和循环中断 最后是System.out.printlnx++y;给出6和3


注意:如果条件只执行一次

您想过通过调试器运行它吗?我们不知道您对它有什么不了解。在纸上追踪执行情况;或者使用调试器单步执行。是。我在纸上写了将近10次,一直以来我都得到了85。@vicky你注意到了&&的短路语义吗,也就是说,只有当左手操作数为真时才计算右手操作数?我的意思是一步一步,然后你可以看到代码和纸之间的区别你想过通过
调试器?我们不知道你有什么不明白的。在纸上追踪执行情况;或者使用调试器单步执行。是。我现在在纸上跟踪了近10次,我一直都得到了85。@vicky你注意到了&&的短路语义吗,也就是说,只有当左手操作数为真时才计算右手操作数?我的意思是一步一步,然后你才能看到代码和纸之间的区别,明白了吗。谢谢,伙计,我现在会更频繁地使用调试器。谢谢。谢谢,伙计,我现在会尝试更频繁地使用调试器。谢谢