【问题标题】:Difference between b=b++ and b++ [duplicate]b = b ++和b ++之间的区别[重复]
【发布时间】:2015-02-21 15:32:22
【问题描述】:

我在一次采访中被问到以下问题。

int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;

每行执行后 b 的值是多少? 每行的输出为 0。

为什么输出不是 0,1,2,3 ?

【问题讨论】:

    标签: java post-increment


    【解决方案1】:

    在 Java 中,表达式

    b = b++
    

    等价于

    int tmp = b;
    b = b + 1;
    b = tmp;
    

    因此结果。

    (在其他一些语言中,完全相同的表达式具有未指定的行为。请参阅Undefined behavior and sequence points。)

    【讨论】:

      【解决方案2】:

      因为这是b = b++的执行顺序:

      1. b 的值获取到某个临时文件中(可能是到字节码寄存器中);这是b++ 的第一部分,因为它是一个post-increment
      2. 递增并将递增后的结果存储在bb++的第二部分)
      3. 将步骤 1 中的值分配给 b= 的结果)

      【讨论】:

      • 从我在字节码中看到的 - 2: iload_1 m 3: iinc , 6: istore_1 被一个接一个地调用。因此,b 的值首先被加载到堆栈中(从局部变量数组),然后 b 的值被获取、递增并写回变量 b。因此,这里的 b 将为 1。然后调用 istore_1,它将从堆栈中弹出 b 的值,并用堆栈 (0) 上的当前值覆盖变量 b(局部变量数组)。因此,在特定实现中,在字节码级别本身,值被 覆盖 :)
      • @TheLostMind:是的,首先在上面的#2 中写入,然后在上面的#3 中覆盖。我怀疑如果它是一个热点,HotSpot 会...修复它...
      • 这个热点解决了什么问题?我只是好奇。它会跳过iinc吗?
      • @TheLostMind:我对 HotSpot 的内部结构了解不多,但 HotSpot 的工作是让代码中的热点更快。在这里,我们显然有一个死存储(iinc 后跟 istore_1),所以......谁知道呢,也许它甚至可以把整个事情变成一个空操作,因为它就是这样。
      • 可能是。我有一种感觉,最新的热点是 this 聪明:).. 谢谢
      【解决方案3】:

      b++ 等同于:

      int temp = b;
      b = b + 1;
      return temp;
      

      如您所见,b++ 将返回他的旧值,但会覆盖b 的值。但是由于您将返回的(旧)值分配给b,因此新值将被覆盖并因此被“忽略”。

      不同的是,如果你写:

      b = ++b; //exactly the same as just "++b"
      

      这会先进行递增,然后返回新值。

      【讨论】:

        【解决方案4】:

        提示:

        int b = 0, c;
        c = b++;
        c = b++;
        c = b++;
        c = b++;
        System.out.println(c);
        

        c 现在会像你想的那样是 3,但是因为在你的问题中你分配了 b,所以它会得到 0,因为正如已经解释过的,它与:

        int tmp = b;
        b = b + 1;
        b = tmp;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-12
          • 2019-12-18
          • 2017-04-26
          • 2014-12-05
          • 2021-05-20
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多