一个php简单又复杂的问题

代码如下:

<?php
$a = 7;
echo $a-- - - --$a;
echo $a;

运行结果是125

求解计算机是如何计算出12的结果呢?

阅读 2.8k
3 个回答

感谢 @小草 的指出,很抱歉对楼主有一定的误导。
之前我对后置运算符的副作用生效时间理解有问题,查询文档之后,确认了。

$a-- 返回 $a,然后将 $a 的值减一。

$a-- 返回的是 $a 减一 之前的值。

修改之后的回答如下:

原理依据: 运算符的优先级递增/递减运算符

优先级规则如下:
clipboard.png

递增运算符规则如下:
clipboard.png

解释如下:

  1. 根据优先级规则,题中代码等价于

<?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 角度来看这段代码,如下图所示:
clipboard.png

我们可以看到,POST_DEC 生成,PRE_DEC 后生成,然后是两个 SUB
其中,需要特别理解的是,后置递减副作用的生效节点。

有意思了,我也觉得是 7- -5=12

$a = 7;
$a-- + $a;    //输出13,7+6

运算符后面 $a--的副作用已经产生了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题