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

int x = 7;
x = x++;

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

根据从类文件中获得的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 +1

因为:

int x = 7; x = x++;
x is 7

int x = 7; x = x = x+1;
x is 8

现在看来有点奇怪:

int x = 7; x = x+=1;
x is 8

非常依赖于编译器!

int x = 7;
x = x++;

它在C和Java中有未定义的行为,请参阅这个答案。这取决于编译器发生了什么。

当int x = 7;X = X ++;?

Ans - >x++表示首先使用x的值作为表达式,然后将其增加1。 这就是你的情况。RHS上的x的值被复制到LHS上的变量x,然后x的值增加1。

类似地,++x表示->先将x的值加1,然后在表达式中使用。 在这个例子中,如果x = ++x;// where x = 7 你会得到8的值。

为了更清楚,请尝试找出有多少printf语句将执行以下代码

while(i++ <5)   
  printf("%d" , ++i);   // This might clear your concept upto  great extend