执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
当前回答
增量发生在x被调用之后,所以x仍然等于7。当调用x时,++x将等于8
其他回答
因为x++在将值赋值给变量后会增加值。 因此,在执行这一行时:
x++;
变量x仍然有原始值(7),但是在另一行再次使用x,例如
System.out.println(x + "");
结果是8。
如果您想在赋值语句中使用x的递增值,请使用
++x;
这将使x增加1,然后将该值赋给变量x。
(编辑) 不是x = x++,而是x++;前者将x的原始值赋给自己,所以它实际上在这一行上什么也不做。
最简单的解释!
这是因为在操作数对其进行后加1之后,++意味着首先将值赋给变量,然后再加1。而如果你期望x值为8,那么你应该像下面提到的那样预先增加它:
我认为这个争议是可以解决的,不需要进入代码,只需要思考。
考虑i++ & ++i作为函数,比如Func1和Func2。
现在我= 7; Func1(i++)返回7,Func2(++i)返回8(大家都知道)。在内部,这两个函数都将i增加到8,但它们返回不同的值。
i = i++调用函数Func1。在函数内部,i增加到8,但完成后函数返回7。
所以最终7被分配给i(最后i = 7)
x = x++;
等于
int tmp = x;
x++;
x = tmp;
根据从类文件中获得的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