Java 下面程序的输出给了我,只是没有点击。答案是63,我显然不明白
&&是短路运算符,这意味着在++x至少为3之前,不会计算++y>2。在这种情况下,我们可以简单地添加调试消息,以获取if块前后的x、y和z值,从而准确地了解发生了什么以及何时发生。像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 >
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你注意到了&&的短路语义吗,也就是说,只有当左手操作数为真时才计算右手操作数?我的意思是一步一步,然后你才能看到代码和纸之间的区别,明白了吗。谢谢,伙计,我现在会更频繁地使用调试器。谢谢。谢谢,伙计,我现在会尝试更频繁地使用调试器。谢谢