会是怎样的$ A + $一个输出++ + $与$一个一个++ = 1

问题描述:

$a = 1会是怎样表达的输出echo ($a + $a++ + $a++)

+2

橡胶鸭它,你会弄明白 –

+0

从C(其中PHP在某种程度上是)衍生大多数语言会说这是*未定义行为*。这完全取决于操作如何排序。 –

+2

这就是实际发生的情况:https://3v4l.org/sqCkW/vld#output – iainn

这可能会更好用更短的例子来说明:

$a = 1; 
echo $a + $a++; 

这可能看起来像它应该等于2的递增运算符($a++)返回变量的值,“之前”,所以应该返回1和1 + 1等于2

然而,实际发生的是$a++正在接受评估。所以后增量运算符运行,并返回1,但在其余的评估发生时,$a已增加到2.因此,这最终评估2 + 1;

你举的例子归结为:

  • 运行第一$a++,返回1 $ A现在是2;
  • 评估总和2 + 1(新$a值和从INCR后操作者的返回),返回3
  • 运行第二$a++(线的端部),增量之前返回2(的$a值)。 $ a现在是3;
  • 评估第二总和,3 + 2,返回5

总之,请不要写这样的代码行。如果你想知道PHP如何在内部工作,他们是一个有趣的实验,但它们不是直观的。

修改添加: @纳尔夫的下面评论也很重要。这是未定义的行为,不应该依赖。事实上,答案确实在PHP < 5.1中有所不同。见https://3v4l.org/sqCkW

+1

这解释了它如何工作* ed *,但不是一个明确的答案......看我的。 – Narf

+0

@Narf好点,更新 – iainn

operators precedence手册明确表明以此为未定义行为的一个例子:

运算符优先级和结合仅确定表达式的分组方式,他们不指定评估的顺序。 PHP不会(通常情况下)指定评估表达式的顺序,并且应避免假定特定评估顺序的代码,因为PHP的各个版本之间的行为可能会发生变化,或者取决于周围的代码。

实例#评价2未定义顺序

<?php 
$a = 1; 
echo $a + $a++; // may print either 2 or 3