为什么以下代码
int i = 1;
System.out.print(i += i++);
System.out.print(i);
第二次打印输出2 两次而不是3?
有人可以对此有所了解吗?
感谢。
答案 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
非常直接。