以下程序的输出给了我,它只是没有点击。答案是6 3,这显然是我不理解的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以下程序的输出给了我,它只是没有点击。答案是6 3,这显然是我不理解的相关的知识,希望对你有一定的参考价值。
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);
}
}
&&
是一个短路算子,这意味着++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
好吧,这很简单让我们第一次看看当z = 0
for
循环到达if
语句时,它首先检查左侧++i
是预增量,所以i
在比较之前变为1然后1> 2返回false而不检查第二部分。
现在qazxsw poi再次预增量和qazxsw poi再次条件返回false而y仍然为0
现在z = 1
和i = 2
z = 2
返回true现在和现在将在i = 3
和3>2
预增量但返回false
现在y
和y=1
然后z = 3
再次返回i = 4
false
现在y =2
和2>2
and z= 4
以及i = 5
语句中的两个条件都返回true并且它的正文执行意味着x和x的后增量将是y = 3
现在if
和x= 6
循环条件返回false和循环中断,最后z = 5
给出6和3
注意:如果条件只执行一次
如果你发现你认为输出是for
,你会忽略一个微妙的事实:
System.out.println(x + " " + y);
8 5
运营商是一家短路运营商。这意味着右手操作数仅在左操作数为真时进行计算。
有一个非短路和操作员 - if (++x > 2 && ++y > 2)
- 它总是评估两者;但这不是这里使用的。如果你用&&
替换&
,你确实得到了&&
。如果在评估操作数时没有副作用,那么&
和8 5
在逻辑上给出了相同的结果,所以&&
被更频繁地使用(在某种程度上我不记得上次我在实际代码中读过布尔&
,没关系写了一个)因为它避免了不必要的工作。
因此,在循环的前2次迭代中,&&
递增而不增加&
。
之后,x
和y
都会增加。
您可以通过使用调试器自己找到它,或者只是在每次循环迭代时打印出x
和y
的值。你很快就会发现与纸上工作的区别。
以上是关于以下程序的输出给了我,它只是没有点击。答案是6 3,这显然是我不理解的的主要内容,如果未能解决你的问题,请参考以下文章
jupyter notebook 和 spyder 没有从 anaconda 提示符启动。但是它之前工作正常。它给了我以下错误: