后置自增行为

3
我有一个小疑问,为什么下面的代码输出i=2。
int i=2;
i=i++;
System.out.println(i);

有人能解释一下第2行发生了什么吗?

所以在这里做++没有意义吗?

谢谢


不需要将 i++ 值再次赋值给 iint i = 2; i++; System.out.println(i); - Roddy of the Frozen Peas
或者 int i = 2; System.out.println(++i); - Marko Topolnik
最近发布了同样的问题。http://stackoverflow.com/questions/12033676/if-y-1-and-y-y-why-when-i-print-y-is-the-value-1 - Miljen Mikic
@MarkoTopolnik:此外,它是几天前发布的(如果它在2009/2010年发布我也不会感到惊讶)。 - kosa
@Nambari 是的,这真的让我感到困惑。有时旧问题会慢慢积累赞,但似乎在发布后立即出现了令人难以置信的一连串赞。哇,它实际上有62个赞和25个踩! - Marko Topolnik
显示剩余3条评论
4个回答

4
i=i++;

因为首先进行赋值操作,然后再执行递增操作。

类似于:

首先 i 被赋值为 2,然后执行 ++ 操作,但结果不会重新赋值给 i,所以 i 的值仍然是 2。


递增后,值存储在堆栈还是堆上?除非再次存储在某个变量中,否则递增的值会丢失吗? - Raghunandan
@Raghunandan:假设它是局部变量,它将存储在堆栈上。它将保留在内存中,但没有办法引用/访问它。 - kosa
谢谢,这解决了我的疑惑。对你的解释点个赞(+1)。 - Raghunandan
@Raghunandan:不要使用后增量操作符,可以使用 i += 1; 或者 i = i+1 等等。 - kosa
这个答案的解释是错误的。它被标记为正确答案,会误导到达这个问题的人。正确的答案像这样:https://dev59.com/2msz5IYBdhLWcg3wbHEw#7911791 - didxga

2

i = i++; 首先计算 i++ 表达式,它会将 i 加一并返回加一前的值。由于你立即将这个值赋给了 i,它重置了 i 的值,使得增量似乎从未发生过。i = ++i; 则会导致另一种行为。


0

感谢大家在我理解有价值的事情方面给予的帮助。

我在某处发现了一个不错的帖子。

我只是从stackoverflow论坛提供的建议中得到了答案,但是我感觉缺少了一些清晰的解释。

Miljen Mikic提供的链接无效,并显示页面未找到。

下面针对问题给出了一些清晰的解释。

int a=2, b=2;
int c = a++/b++;
System.out.println(c);

反汇编为以下内容。

   0:iconst_2      ; [I]Push the constant 2 on the stack[/I]  
   1:istore_1      ; [I]Pop the stack into local variable 1 (a)[/I]  
   2:iconst_2      ; [I]Push the constant 2 on the stack, again[/I]  
   3:istore_2      ; [I]Pop the stack into local variable 2 (b)[/I]  
   4:iload_1       ; [I]Push the value of a on the stack[/I]  
   5:iinc1, 1  ; [I]Add 1 to local variable 1 (a)[/I]  
   8:iload_2       ; [I]Push the value of b on the stack[/I]  
   9:iinc2, 1  ; [I]Add 1 to local variable 2 (b)[/I]  
   12:idiv          ; [I]Pop two ints off the stack, divide, push result[/I]  
   13:istore_3      ; [I]Pop the stack into local variable 3 (c)[/I]  
   14:return  

这有助于我更好地理解。

如果我的观点有误,请添加。

感谢您所有的回答。


0
当你写下i=i++;时,你是在告诉计算机将i赋值给i,然后再增加i的值,但这不会影响i的值,因为i的值仍然是2。
正确的做法应该是i=++i;,意思是在将i赋值给i之前先将i加1,或者你可以简单地使用i++;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接