为了账号安全,请及时绑定邮箱和手机立即绑定

一个php简单又复杂的问题

一个php简单又复杂的问题

PHP
MMMHUHU 2019-03-18 16:56:51
代码如下: <?php $a = 7; echo $a-- - - --$a; echo $a; 运行结果是12和5 求解计算机是如何计算出12的结果呢?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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

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

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

修改之后的回答如下:

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

优先级规则如下:
https://img1.sycdn.imooc.com//5c8f5d4f000139ad08000617.jpg

递增运算符规则如下:
https://img1.sycdn.imooc.com//5c8f5d51000109d008000149.jpg

解释如下:

  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 角度来看这段代码,如下图所示:
https://img1.sycdn.imooc.com//5c8f5d520001468a08000645.jpg

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

查看完整回答
反对 回复 2019-03-18
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

7 - -5 = 12

查看完整回答
反对 回复 2019-03-18
?
HUX布斯

TA贡献1876条经验 获得超6个赞

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

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

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

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 429 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信