php引用后自加的问题

Cherish_ws 2016-12-28 11:15:15

知乎上看到的一个问题,

echo (++$a) + (++$a) + (++$a)."\n";//这里输出的是10,而不是2+3+4=9

在php个版本上的的结果不同,php 7 上的输出是9,php 7之前的版本是10.
...全文
349 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2017-02-15
  • 打赏
  • 举报
回复
9

<?php
$a = 1;
$b = &$a;
echo (++$a) + (++$a) + (++$a)."\n";
?>
php7.0.7
blizzf99 2017-02-14
  • 打赏
  • 举报
回复
最讨厌这种题了,鸟用没有,程序是写给别人看的,就应该清晰明了~
Cherish_ws 2017-02-14
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
php 5.4.31

$a = 1;
$b =& $a;
echo (++$a) + (++$a) + (++$a); //10
不应该是 echo 2+3+4; //9 吗?
huajie1988 2017-02-14
  • 打赏
  • 举报
回复
你生成一下opcode就明白了,不加引用的话是如下:

Finding entry points
Branch analysis from position: 0
Return found
filename:       E:\xampp\htdocs\test\opcode.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $a, !1 = $b
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   ASSIGN                                                   !0, 1
   4     1      ASSIGN                                                   !1, !0
   5     2      PRE_INC                                          $0      !0
         3      PRE_INC                                          $2      !0
         4      ADD                                              ~1      $0, $2
         5      PRE_INC                                          $2      !0
         6      ADD                                              ~0      ~1, $2
         7      ECHO                                                     ~0
         8    > RETURN                                                   1

branch: #  0; line:     3-    5; sop:     0; eop:     8
path #1: 0,
9
加入引用之后是这样:

Finding entry points
Branch analysis from position: 0
Return found
filename:       E:\xampp\htdocs\test\opcode.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $a, !1 = $b
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   ASSIGN                                                   !0, 1
   4     1      ASSIGN_REF                                               !1, !0
   5     2      PRE_INC                                          $0      !0
         3      PRE_INC                                          $2      !0
         4      ADD                                              ~1      $0, $2
         5      PRE_INC                                          $2      !0
         6      ADD                                              ~0      ~1, $2
         7      ECHO                                                     ~0
         8    > RETURN                                                   1

branch: #  0; line:     3-    5; sop:     0; eop:     8
path #1: 0,
10
两者唯一的差别是使用的宏不同,这时你就会发现当执行到第四步的时候$0是$a的引用,但你在第三步的时候就已经更改了$0,所以此时就变成了3+3所以结果就是6而不是5,PHP7没有环境所以还不清楚,你可以自行试一下。
Cherish_ws 2017-02-14
  • 打赏
  • 举报
回复
引用 6 楼 u010714784 的回复:
[quote=引用 3 楼 blizzf99 的回复:] 最讨厌这种题了,鸟用没有,程序是写给别人看的,就应该清晰明了~
引用 5 楼 oMiracle123 的回复:
研究这个干嘛。。
就想知道,为什么加了个应用了,就不一样了。[/quote] 更正:是引用
Cherish_ws 2017-02-14
  • 打赏
  • 举报
回复
引用 3 楼 blizzf99 的回复:
最讨厌这种题了,鸟用没有,程序是写给别人看的,就应该清晰明了~
引用 5 楼 oMiracle123 的回复:
研究这个干嘛。。
就想知道,为什么加了个应用了,就不一样了。
「已注销」 2017-02-14
  • 打赏
  • 举报
回复
研究这个干嘛。。
wodebaobei12611 2017-02-14
  • 打赏
  • 举报
回复
同意楼上!!
xuzuning 2016-12-28
  • 打赏
  • 举报
回复
php 5.4.31

$a = 1;
$b =& $a;
echo (++$a) + (++$a) + (++$a); //10

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧