执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
当前回答
int x = 7;
x = x++;
它在C和Java中有未定义的行为,请参阅这个答案。这取决于编译器发生了什么。
其他回答
它在“x = x++;”后面递增。如果你写x = ++x;它就是8。
增量发生在x被调用之后,所以x仍然等于7。当调用x时,++x将等于8
后增量算子的工作原理如下:
存储操作数以前的值。 增加操作数的值。 返回操作数的前一个值。
所以这个表述
int x = 7;
x = x++;
将评价如下:
X被初始化为值7 后增量操作符存储x之前的值,即7,以返回。 增加x,现在x等于8 返回x的前一个值,即7,它被赋给x,所以x再次变成7
因此x确实增加了,但由于x++将结果赋值回x,因此x的值被重写为它之前的值。
声明:
x = x++;
等价于:
tmp = x; // ... this is capturing the value of "x++"
x = x + 1; // ... this is the effect of the increment operation in "x++" which
// happens after the value is captured.
x = tmp; // ... this is the effect of assignment operation which is
// (unfortunately) clobbering the incremented value.
简而言之,这个声明没有任何效果。
重点:
后缀自增/自减表达式的值是操作数在进行自增/自减操作之前的值。(在Prefix形式的情况下,值是操作后的操作数的值,) 赋值表达式的RHS在赋值给LHS之前被完全计算(包括任何增量、减量和/或其他副作用)。
注意,与C和c++不同,Java中表达式的求值顺序是完全指定的,没有平台特定的变化空间。编译器只允许重新排序操作,前提是从当前线程的角度来看,这不会改变执行代码的结果。在这种情况下,编译器将被允许优化掉整个语句,因为可以证明它是一个无操作。
如果还不明显的话:
"x = x++;"在任何程序中几乎都是错误的。 OP(对于最初的问题!)可能意味着“x++;”而不是“x = x++;”。 将auto inc/ decentation和赋值结合在一起的语句很难理解,因此无论其正确性如何,都应该避免使用。根本没有必要编写这样的代码。
希望像FindBugs和PMD这样的代码检查器会将这样的代码标记为可疑的。
x = x++;
这是后增量操作符。它应该理解为“使用操作数的值,然后增加操作数”。
如果你想要发生相反的情况,即“增加操作数,然后使用操作数的值”,你必须使用预增加操作符,如下所示。
X = ++ X;
这个运算符首先将x的值加1,然后将值赋回给x。