会是怎样的$ A + $一个输出++ + $与$一个一个++ = 1
问题描述:
当$a = 1
会是怎样表达的输出echo ($a + $a++ + $a++)
答
这可能会更好用更短的例子来说明:
$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
答
为operators precedence手册明确表明以此为未定义行为的一个例子:
运算符优先级和结合仅确定表达式的分组方式,他们不指定评估的顺序。 PHP不会(通常情况下)指定评估表达式的顺序,并且应避免假定特定评估顺序的代码,因为PHP的各个版本之间的行为可能会发生变化,或者取决于周围的代码。
实例#评价2未定义顺序
<?php $a = 1; echo $a + $a++; // may print either 2 or 3
橡胶鸭它,你会弄明白 –
从C(其中PHP在某种程度上是)衍生大多数语言会说这是*未定义行为*。这完全取决于操作如何排序。 –
这就是实际发生的情况:https://3v4l.org/sqCkW/vld#output – iainn