执行时(幕后)会发生什么?

int x = 7;
x = x++;

也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!


当前回答

这是因为您使用了后增量操作符。 在下面的代码行中

x = x++;

实际发生的情况是,你将x的值赋给x, x++在x赋给x后对x加1,这就是后加操作符的工作方式。它们在语句执行之后工作。所以在你的代码中,x先被返回然后再被递增。

如果你有

x = ++x;

答案是8,因为你使用了前增量操作符。这将在返回x值之前先对值进行递增。

其他回答

根据从类文件中获得的Byte码,

这两种赋值都增加x,但不同之处在于将值压入堆栈的时间

在Case1中,Push发生在增量之前(然后稍后分配)(本质上意味着您的增量不做任何事情)

在Case2中,Increment首先发生(使其为8),然后压入堆栈(然后分配给x)

案例1:

int x=7;
x=x++;

字节代码:

0  bipush 7     //Push 7 onto  stack
2  istore_1 [x] //Pop  7 and store in x
3  iload_1  [x] //Push 7 onto stack
4  iinc 1 1 [x] //Increment x by 1 (x=8)
7  istore_1 [x] //Pop 7 and store in x
8  return       //x now has 7

案例2:

int x=7; 
x=++x;

字节码

0  bipush 7     //Push 7 onto stack
2  istore_1 [x] //Pop 7 and store in x
3  iinc 1 1 [x] //Increment x by 1 (x=8)
6  iload_1  [x] //Push x onto stack
7  istore_1 [x] //Pop 8 and store in x
8  return       //x now has 8

Stack在这里指的是操作数Stack, local: x index: 1 type: int

x = x++;

这是后增量操作符。它应该理解为“使用操作数的值,然后增加操作数”。

如果你想要发生相反的情况,即“增加操作数,然后使用操作数的值”,你必须使用预增加操作符,如下所示。

X = ++ X;

这个运算符首先将x的值加1,然后将值赋回给x。

我认为这个争议是可以解决的,不需要进入代码,只需要思考。

考虑i++ & ++i作为函数,比如Func1和Func2。

现在我= 7; Func1(i++)返回7,Func2(++i)返回8(大家都知道)。在内部,这两个函数都将i增加到8,但它们返回不同的值。

i = i++调用函数Func1。在函数内部,i增加到8,但完成后函数返回7。

所以最终7被分配给i(最后i = 7)

后增量算子的工作原理如下:

存储操作数以前的值。 增加操作数的值。 返回操作数的前一个值。

所以这个表述

int x = 7;
x = x++; 

将评价如下:

X被初始化为值7 后增量操作符存储x之前的值,即7,以返回。 增加x,现在x等于8 返回x的前一个值,即7,它被赋给x,所以x再次变成7

因此x确实增加了,但由于x++将结果赋值回x,因此x的值被重写为它之前的值。

它在“x = x++;”后面递增。如果你写x = ++x;它就是8。