摘自 OCP Java SE 6 程序员练习考试第 280 页,第 9 题:
int x = 3;
x = x++;
// x is still 3
在解释中我们可以读到:
The
x = x++;
line doesn't leavex == 4
because the++
is applied after the assignment has occurred.
我同意 x
是 3,我理解后递增。
我不同意这个解释。我会将“之后”替换为“之前”。
我认为它是这样工作的:
x
是 3。x++
被执行。我将这个后增量运算符视为一个函数:int operator++() { int temp = getX(); setX(temp + 1); return temp; }
所以,
x++
执行后,x
为4,但x++
表达式返回的值为3
.- 现在,赋值
=
。只需将返回的3
写入x
。
因此,在我看来,++
是在分配发生之前 应用的。我错了吗?
最佳答案
...the
++
is applied after the assignment has occurred.
好的,等一下。这实际上令人困惑,并且可能暗示不正确的行为。
你有表达式†:
x = ( x++ )
发生的事情是(JLS 15.26.1):
- 评估赋值
x
左侧的表达式(以生成变量)。 - 对赋值
( x++ )
右侧的表达式求值(以产生一个值)。 - 右边的求值是:
x
后递增,表达式的结果是x
的旧值。 - 左侧的变量
x
被赋予右侧计算产生的值,即x
的旧值.
所以后增量发生在赋值之前。
(因此,正如我们所知, x
after 执行语句 x = x++;
的值与x
在执行语句之前,即3
。)
So, in my eyes
++
is applied before the assignment has occurred. Am I wrong?
你是对的。
从技术上讲,它的指定方式是 x++
在其结果存储之前和赋值运算符的求值期间求值。所以 x++
可以解释为发生在赋值之前或期间。不是之后,所以无论哪种方式,这本书似乎都是错误的。
只是为了好玩,我们还可以看看一些字节码:
/* int x = 3; */
iconst_3 // push the constant 3 on to the stack : temp = 3
istore_0 // pop the stack and store in local variable 0 : x = temp
/* x = x++; */
iload_0 // push local variable 0 on to the stack : temp = x
iinc 0 1 // increment local variable 0 by 1 : x = x + 1
istore_0 // pop the stack and store in local variable 0 : x = temp
iinc
发生在 istore
之前。
†:括号对计算没有影响,它们只是为了清楚起见。
关于java - x = x++ 不会递增,因为++ 是在赋值后应用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27082001/