我已将问题缩小到此代码
$a = 3;
$a = 3 * $a++;
echo $a; //9
$a = 3;
$a = $a * $a++;
echo $a; //12
这是第一次操作的 VLD 操作码
compiled vars: !0 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 3
3 1 POST_INC ~2 !0
2 MUL ~3 ~2, 3
3 ASSIGN !0, ~3
4 4 ECHO !0
5 5 > RETURN 1
第二次操作 ($a * $a++)
compiled vars: !0 = $a
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 3
3 1 POST_INC ~2 !0
2 MUL ~3 !0, ~2
3 ASSIGN !0, ~3
4 4 ECHO !0
5 5 > RETURN 1
2个问题:
为什么先执行后增量?这对我来说没有任何意义。传统上,我认为它会在执行表达式中的所有其他操作后增加变量。这也是 PHP 官方网站上所说的。因此,按照我的逻辑(这可能存在难以置信的缺陷),两个表达式都将返回 10。但正如我们所看到的,POST_INC 是在执行其他任何操作之前执行的。
正如我们所看到的,在MUL操作期间,对于第一种情况,~2应该是 POST_INC 的结果(所以值应该是 4),然后乘以 3 是 12。但在第二种情况下,!0仍然是3, ~2似乎也持有3的值,原因我不知道,所以我们最终得到 9。为什么会这样?
我不流利地阅读操作码,所以也许我错过了一些东西,我猜操作数的顺序~2, 3 vs !0, ~2很重要,但我不明白怎么做。
喵喵时光机
郎朗坤
随时随地看视频慕课网APP