执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
执行时(幕后)会发生什么?
int x = 7;
x = x++;
也就是说,当一个变量在一条语句中被递增并分配给自己时?我编译并执行了这个。即使在整个表述之后X仍然是7。在我的书里,它说x是递增的!
当前回答
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
当你为x重新赋值时,它仍然是7。尝试x = ++x,你会得到8个其他的
x++; // don't re-assign, just increment
System.out.println(x); // prints 8
当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
int x = 7;
x = x++;
它在C和Java中有未定义的行为,请参阅这个答案。这取决于编译器发生了什么。
这是因为您使用了后增量操作符。 在下面的代码行中
x = x++;
实际发生的情况是,你将x的值赋给x, x++在x赋给x后对x加1,这就是后加操作符的工作方式。它们在语句执行之后工作。所以在你的代码中,x先被返回然后再被递增。
如果你有
x = ++x;
答案是8,因为你使用了前增量操作符。这将在返回x值之前先对值进行递增。