【发布时间】: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
我在一次采访中被问到以下问题。
int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;
每行执行后 b 的值是多少? 每行的输出为 0。
为什么输出不是 0,1,2,3 ?
【问题讨论】:
标签: java post-increment
在 Java 中,表达式
b = b++
等价于
int tmp = b;
b = b + 1;
b = tmp;
因此结果。
(在其他一些语言中,完全相同的表达式具有未指定的行为。请参阅Undefined behavior and sequence points。)
【讨论】:
因为这是b = b++的执行顺序:
b 的值获取到某个临时文件中(可能是到字节码寄存器中);这是b++ 的第一部分,因为它是一个post-incrementb(b++的第二部分)b(= 的结果)【讨论】:
2: iload_1 m 3: iinc , 6: istore_1 被一个接一个地调用。因此,b 的值首先被加载到堆栈中(从局部变量数组),然后 b 的值被获取、递增并写回变量 b。因此,这里的 b 将为 1。然后调用 istore_1,它将从堆栈中弹出 b 的值,并用堆栈 (0) 上的当前值覆盖变量 b(局部变量数组)。因此,在特定实现中,在字节码级别本身,值被 覆盖 :)
iinc吗?
iinc 后跟 istore_1),所以......谁知道呢,也许它甚至可以把整个事情变成一个空操作,因为它就是这样。
b++ 等同于:
int temp = b;
b = b + 1;
return temp;
如您所见,b++ 将返回他的旧值,但会覆盖b 的值。但是由于您将返回的(旧)值分配给b,因此新值将被覆盖并因此被“忽略”。
不同的是,如果你写:
b = ++b; //exactly the same as just "++b"
这会先进行递增,然后返回新值。
【讨论】:
提示:
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;
【讨论】: