Java中输出的差异

时间:2011-05-27 05:13:49

标签: java

我在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

为什么会这样来?

4 个答案:

答案 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。