java - x = x++ 不会递增,因为++ 是在赋值后应用的?

标签 java scjp post-increment

摘自 OCP Java SE 6 程序员练习考试第 280 页,第 9 题:

int x = 3;
x = x++;
// x is still 3

在解释中我们可以读到:

The x = x++; line doesn't leave x == 4 because the ++ is applied after the assignment has occurred.

我同意 x 是 3,我理解后递增。

我不同意这个解释。我会将“之后”替换为“之前”

我认为它是这样工作的:

  1. x 是 3。
  2. x++ 被执行。我将这个后增量运算符视为一个函数:

    int operator++() {
        int temp = getX();
        setX(temp + 1);
        return temp;
    }
    

    所以,x++执行后,x为4,但x++表达式返回的值为3 .

  3. 现在,赋值 =。只需将返回的 3 写入 x

因此,在我看来,++ 是在分配发生之前 应用的。我错了吗?

最佳答案

...the ++ is applied after the assignment has occurred.

好的,等一下。这实际上令人困惑,并且可能暗示不正确的行为。

你有表达式:

x = ( x++ )

发生的事情是(JLS 15.26.1):

  1. 评估赋值 x 左侧的表达式(以生成变量)。
  2. 对赋值 ( x++ ) 右侧的表达式求值(以产生一个值)。
  3. 右边的求值是:x后递增,表达式的结果是x的旧值。
  4. 左侧的变量 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/

相关文章:

java - 安卓.view.WindowManager$BadTokenException : Unable to add window -- token null is not for an application

java - 如何在 Play Framework 2.1.x 上使用 YAML 填充 ManyToMany 关系

java - OCP 1.6 或 JAVA SE 7 程序员 1

c - 关于 printf 语句输出的问题

java - 如何使数字结果不带小数

java - 如何在不安装jdk或jre的情况下在任何计算机上单击.exe而不是jar文件来运行java应用程序

java - 任何人都可以向我解释一下这个自动装箱吗?

java - 用户定义的包和系统定义的java包在访问静态内容方面有什么区别

Java 增量和赋值运算符

c++ - 你能在c中的同一个语句中的同一个变量上有一个递增器和一个递减器吗