我在java中有一个程序。我对输出感到困惑。
public static void main(String args[])
{
int n=0;
for(int m=0; m<5;m++)
{
n=n++;
System.out.println(n);
}
}
此处输出为0 0 0 0 0
但如果我写,
public static void main(String args[])
{
int n=0;
for(int m=0; m<5;m++)
{
n++;
System.out.println(n);
}
}
然后输出为1 2 3 4 5
为什么会这样来?
答案 0 :(得分:13)
因为,在第一个代码段中,n++
在增量之前解析为n
。所以,当你这样做时:
n = n++;
它保存n
,然后递增它,然后将保存的值写回n
。
在第二个片段中,该分配没有发生,因此增量“粘住”。
将操作想象如下,操作顺序从最里面的[ ]
个字符到最外面的字符:
[n = [[n]++]] [[n]++]
- current n (0) saved. - current n (0) saved.
- n incremented to 1. - n incremented to 1.
- saved n (0) written to n. - saved n (0) thrown away.
如果您想增加n
,则应使用n = n + 1;
或n++;
。
答案 1 :(得分:5)
那是因为你使用的是post-increment(n ++)而不是pre-increment(++ n)。这条线将满足您的期望:
n = (++n);
PS :是的,这些链接为c / c ++解释了这一点,但几乎每种编程语言的行为都是一样的。
编辑:感谢Prasoon Saurav和paxdiablo,我今天学到了新东西。链接的网站对于c和c ++可能是错误的,但它们仍然解释了java中会发生什么。
答案 2 :(得分:2)
n=n++;
评估顺序是从左到右。
在每次迭代后n
被分配为0,因为n++
在增量之前评估为n
。
这就是你得到的输出。
您应该写n = n+1
以获得所需的输出..
P.S:在旁注n = n++
中调用C和C ++中的未定义行为。 ; - )
答案 3 :(得分:0)
n ++表示“返回当前值,然后递增”。所以你要做的是返回0,递增到1,然后将前一个值(0)分配回n。
结果 - n保持为0。