【问题标题】:Java Incremental Oddity [duplicate]Java增量奇数[重复]
【发布时间】:2020-06-25 15:49:51
【问题描述】:

您可能已经在某个地方看到过这个,但我找不到关于它的问题。这只是一种好奇心,但我想知道幕后到底发生了什么:

int j = 0;
for (int i = 0; i < 100; i++) {
   j = j++;
}

System.out.println(j);

尽管第一次出现,上面的输出将为 0。以前,我以为它会这样工作:右边(0)的j分配给左边(0)的j,然后左边的j递增为1。我的问题是:因为@左边的987654327@和右边的j在同一个地址,为什么后面的增量不粘了?我之前曾想过,后增量运算符将执行延迟到分配之后。就像这样:“j = 0; k = j++;”将导致k == 0j == 1。那么编译器在执行“j = j++;”时究竟会发生什么?

【问题讨论】:

  • 看看这个stackoverflow.com/questions/2371118/…(然后在你的脑海中将j++评估为零,增加j,然后将零分配给j,然后就可以了)
  • 这能回答你的问题吗? Java increment and assignment operator
  • 谢谢sfiss,我没看到那个帖子。该帖子中的第三个答案回答了它;后增量运算符实际上只是在赋值之前执行之前,而不是在整个语句执行之后,正如我之前所想的那样。
  • 对于阅读此问题的任何人,请不要投反对票。谢谢。

标签: java post-increment


【解决方案1】:

这很简单:

由于++是后缀,表示赋值后递增。

所以在这种情况下你:

  1. 赋值 j = j 使 j 为 0
  2. 增加右手边j,

但这不会影响新的 j,因为它发生在分配之后。

这将类似于

int newj = oldj;
oldj = oldj+1;

【讨论】:

  • 相似度不准确; j 的地址永远不会改变,如果该地址的值在赋值后递增,那么它仍然会从 0 到 100;这就是我询问编译器究竟做了什么的意思。但是我现在从另一个问题的链接中看到,它实际上将原始值提交给操作员并在分配之前执行增量。对不起,如果我的措辞引起任何混乱。
  • 要看看到底发生了什么,最好反编译成字节码自己检查。这是一个非常有趣的练习
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2015-05-03
  • 2015-12-21
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
相关资源
最近更新 更多