【发布时间】:2020-01-23 14:32:46
【问题描述】:
我已将问题缩小到此代码
$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很重要,但我不明白如何。
【问题讨论】: