我在面试中被问到以下问题:
每执行一行后,变量 b 的值是多少? 每行的输出都是 0。 为什么输出不是 0、1、2、3?
int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;
每执行一行后,变量 b 的值是多少? 每行的输出都是 0。 为什么输出不是 0、1、2、3?
int b = 0;
b = b++;
b = b++;
b = b++;
b = b++;
b = b++
等同于
int tmp = b;
b = b + 1;
b = tmp;
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;
b = b++
的执行顺序:
b
的值存入某个临时变量(可能存入字节码寄存器); 这是b++
的第一部分,因为它是一个后增量b
中(即b++
的第二部分)b
(即=
的结果)b++
与以下代码相同:
int temp = b;
b = b + 1;
return temp;
正如您所看到的,b++
将返回它的旧值,但会覆盖 b
的值。但是,由于您将返回的(旧)值分配给了 b
,新值将被覆盖,因此被“忽略”。
如果您这样写,则会有所区别:
b = ++b; //exactly the same as just "++b"
2: iload_1 m 3: iinc , 6: istore_1
连续被调用。因此,变量b
的值首先被加载到堆栈中(从本地变量数组中),然后获取b
的值,对其进行递增并将其写回变量b
中。所以,在这里b
将是 1。然后调用 istore_1,它将从堆栈中弹出b
的值,并使用堆栈上的当前值(0)覆盖变量b
(本地变量数组)。因此,在 m 特定实现中,字节码级别上的值正在被覆盖 :) - TheLostMindiinc
吗? - TheLostMindiinc
后面跟着istore_1
),所以...谁知道呢,也许它甚至可以将整个东西转化为no-op,因为那就是它的本质。 - T.J. Crowder