java - 请解释 "x = x++;"中的++ 运算符发生了什么。增量在哪里完成?

标签 java increment

<分区>

下面的代码发生了什么?

public static void main (String[] args) {
    int x = 5;
    x = x++;
    System.out.println(x);  // 5. So what happened to the ++?
}

我可以理解 x 被赋值为 5,因为我们告诉它在递增之前取值。

但是,它仍然必须进行递增,所以这是在临时值上完成的吗?

我不懂 Java 字节码,但它反汇编如下。

  public static void main(java.lang.String[]);
Code:
   0: iconst_5
   1: istore_1
   2: iload_1
   3: iinc          1, 1
   6: istore_1
   7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
  10: iload_1
  11: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
  14: return

我看不到它在哪里创建临时文件。 到底发生了什么?

最佳答案

However, it must still do the increment, so is this done on a temporary value?

为什么?如果操作没有明显效果,则无需执行。

这里发生的是:

  1. 表达式 x++ 被求值。结果是 5。
  2. 变量 x 递增,作为++ 运算符的副作用。
  3. 变量x被赋值为(1)中表达式的值,即5,

最后 x 的值明确为 5。优化编译器可以删除++ 操作,因为它对 x 的最终值或程序的任何其他部分没有影响。

就 Java 而言,优化不仅发生在编译器中,还发生在运行时。因此,即使程序集包含“iinc”,也可以在以后进行优化。

这是优化的 C 编译器输出示例。如您所见,它不包含增量操作:

https://godbolt.org/g/2iTLhZ

注意:您的编译器可能会警告表达式“可能未定义”。这是因为在 C 中,赋值的右侧和左侧以未指定的顺序求值。正如我们所见,在这个特定示例中,任一顺序都给出相同的结果(因为左侧是常量引用),但需要注意这一点。

关于java - 请解释 "x = x++;"中的++ 运算符发生了什么。增量在哪里完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922043/

相关文章:

java - 重命名 R3 Corda 模板包时出错

java - IDEA "never accessed"关于增量运算符++的警告

python - 在 python 中增加 1.0 会给出意想不到的答案

Python字典增量

C++: 整数我;大小(++i); ...我不增值?

java - 无法使用 Jsoup HTML 解析器 Java 实现某些功能

java - 如何将身份验证从 LDAP 更改为 JDBC 以保护我的应用程序

java - 以编程方式调整线性布局的高度

java - while循环(检查键盘输入的是否不是int,然后不断询问,直到插入int)

MySQL - 表中的第二个序列(例如按类别)