关于增量后算子的问题

时间:2010-01-17 12:56:52

标签: java post-increment

为什么以下代码

int i = 1; 
System.out.print(i += i++);
System.out.print(i);

第二次打印输出2 两次而不是3?

有人可以对此有所了解吗?

感谢。

5 个答案:

答案 0 :(得分:4)

如果你意识到a ++的工作原理如下(伪代码):

func ++(ref a)
{
    int b=a;
    a=a+1;
    return b;
}

然后这一切都有道理。

答案 1 :(得分:3)

看起来我最终应该是3岁。

但是,如果你仔细研究一下这个陈述

i += (i++)

等于

i = ( i + (i++) ) 

,在这种情况下,1 + 1。

i ++的副作用是i = i + 1 = 1 + 1 = 2,正如您所期望的那样,但是i的值在赋值后被覆盖。

答案 2 :(得分:2)

我还不太了解Java字节码语法,但根据我的字节码级别,您的代码看起来像这样:

int i = 1;  // iconst_1:    variables { }, stack {1}
            // istore_1:    variables {1}, stack { }
i += i++;   // iload_1:     variables {1}, stack {1}
            // iinc 1, 1:   variables {2}, stack {1}
            // iadd:        variables {2}, stack {2} ...Note that here 1 gets added to the value on stack
            // istore_1:    variables {2}, stack {2} ...Here the variable value will overwrite the stack value

我认为这解释了你得到的输出很好。 : - )

专家,如果我错了,请纠正我......

答案 3 :(得分:2)

我认为这不是一个问题,因为不知道后缀一元运算符( expr ++)是如何工作的。正是评估语句的顺序造成了混淆。

int i = 1;
System.out.println(i += i++); // Output: 2

因此,最后一个语句与此顺序中的以下两个语句相同:

i++; // i is now 2 for the rest of this statement and the program
i = 1 + 1; // i is assigned again  

因此首先评估后缀运算符,然后评估整行,但使用之前的i值。

所以,使用另一个让这个更清晰的例子:

int i = 2;
System.out.println(i += i++); // Output: 4
System.out.println(i); // Output: 4  

另一个例子:

int i = 2;
System.out.println(i = i + i++ + i--); // Output: 7
System.out.println(i); // Output: 7  

第二行是分配 i 。第一个 i 是2,下一个 i 也是2,但现在第三个 i 是3,因为 i ++ 改变了 i 的价值。与之前的情况一样, i - 对i不会有任何影响,因为它会被 i = 2 + 2 + 3 重写。

int i = 1;
System.out.println(i = i++ + i); // Output: 3
System.out.println(i); // Output: 3

答案 4 :(得分:-1)

1 + 1 == 2. 

因此:

i + i == 2  

i += i == 2

然后

i += i++ == 2

非常直接。