感谢 @小草 的指出,很抱歉对楼主有一定的误导。之前我对后置运算符的副作用生效时间理解有问题,查询文档之后,确认了。 $a-- 返回 $a,然后将 $a 的值减一。 $a-- 返回的是 $a 减一 之前的值。 修改之后的回答如下: 原理依据: 运算符的优先级、递增/递减运算符 优先级规则如下: 递增运算符规则如下: 解释如下: 根据优先级规则,题中代码等价于 <?php $a = 7; echo ($a--) - (- (--$a)); echo $a; 其中,第一个 echo 中,根据 -- 运算符优先级 $a-- 先执行,但是其副作用在此 第一个括号之后生效,所以此时参与运算的是 7,但是 $a 的值已经变成了 6 --$a 在 $a-- 后执行,但是其副作用先生效,此时 $a 的值变成了 5,并参与后边运算 所以,第一个 echo 等价于:echo 7 - (-5),结果为 12;第二个 echo 为 $a 经过两次递减之后的值:5 下边从 opcode 角度来看这段代码,如下图所示: 我们可以看到,POST_DEC 生成,PRE_DEC 后生成,然后是两个 SUB。其中,需要特别理解的是,后置递减副作用的生效节点。
感谢 @小草 的指出,很抱歉对楼主有一定的误导。
之前我对后置运算符的副作用生效时间理解有问题,查询文档之后,确认了。
$a--
返回的是$a
减一 之前的值。修改之后的回答如下:
原理依据: 运算符的优先级、递增/递减运算符
优先级规则如下:

递增运算符规则如下:

解释如下:
根据优先级规则,题中代码等价于
其中,第一个
echo
中,根据--
运算符优先级$a--
先执行,但是其副作用在此 第一个括号之后生效,所以此时参与运算的是7
,但是$a
的值已经变成了6
--$a
在$a--
后执行,但是其副作用先生效,此时$a
的值变成了5
,并参与后边运算所以,第一个
echo
等价于:echo 7 - (-5)
,结果为12
;第二个
echo
为$a
经过两次递减之后的值:5
下边从

opcode
角度来看这段代码,如下图所示:我们可以看到,
POST_DEC
生成,PRE_DEC
后生成,然后是两个SUB
。其中,需要特别理解的是,后置递减副作用的生效节点。