【问题标题】:Trying to understand operator precedence with assign by reference尝试通过引用分配来理解运算符优先级
【发布时间】:2015-03-09 03:46:48
【问题描述】:

Operator precedence 告诉订单应该是:+, &, =。但是这段代码执行表明顺序是:&, =, +

$b = 1;
$a = & $b + print('print executed');
if ($a == 1)
    echo ' but one was not added and error was not raised';

输出print executed but one was not added and error was not raised

为什么这种情况下的优先级会改变?

附言

$a = new stdClass();

$c = &$a instanceof $a;
var_dump($c); // class stdClass#1 (0) {}

$b = $a instanceof $a;
var_dump($b); // bool(true)

【问题讨论】:

  • 哦,sectus,你为什么让我的眼睛这么痛?
  • @Ja͢ck,我只是好奇...
  • & 不是这里的二元“和”运算符。
  • @Ja͢ck,我知道。但他们有关系。按位 & 和引用 & 在优先表中占有一席之地。但在这种情况下,它是一个参考。
  • 这里的预期结果到底是什么?!您要通过引用 分配$b + (1) 的值吗?由于这没有任何意义,因此这里的结果介于未定义和预期之间。

标签: php reference variable-assignment


【解决方案1】:

可以说,这并不能真正回答您的问题,但请考虑以下代码:

$b = 1;
$a = &$b + 123;

操作码揭示了以下执行策略:

compiled vars:  !0 = $b, !1 = $a
line     # *  op                       fetch          ext  return  operands
-----------------------------------------------------------------------------
   3     0  >   ASSIGN                                              !0, 1
   4     1      ASSIGN_REF                                   $1      !1, !0
         2      ADD                                          ~2      $1, 123
         3      FREE                                                 ~2

如您所见,通过引用进行赋值,加法存储在临时变量中,然后被释放;基本上,没有操作。

也许文档可能更清楚,但我无法想象这个特定代码会有意义的场景:)

【讨论】:

  • 是的。我的想法是正确的优先。并且有一个操作员(= &ASSIGN_REF)而不是两个。这是文档的缺陷。
猜你喜欢
  • 2013-07-27
  • 2015-07-09
  • 2014-09-09
  • 1970-01-01
  • 2011-07-07
  • 2016-03-30
  • 2018-04-12
相关资源
最近更新 更多