当$a = 1
表达式echo ($a + $a++ + $a++)
答案 0 :(得分:3)
用更短的例子可以更好地解释这一点:
$a = 1;
echo $a + $a++;
这可能看起来应该等于2.后增量运算符($a++
)在"之前返回"变量的值,所以它应该返回1.而1 + 1等于2.
然而,实际发生的事情是$a++
首先得到评估。所以后增量运算符运行,并返回1,但是当评估的其余部分发生时,$a
已经增加到2.所以这最终会评估2 + 1
;
你的例子归结为:
$a++
,返回1. $ a现在是2; 2 + 1
(新的$a
值和post-incr运算符的返回值),返回3 $a++
(行尾),返回2(增量前$a
的值)。 $ a现在是3; 3 + 2
,返回5 简而言之,请不要写这样的代码行。如果你想知道PHP如何在内部工作,它们是一个有趣的实验,但它们并不是直观的。
编辑添加: @ Narf的评论也很重要。这是未定义的行为,不应该依赖。事实上,答案的确在PHP中确实有所不同< 5.1。见https://3v4l.org/sqCkW
答案 1 :(得分:3)
operators precedence的手册明确地将此作为未定义行为的示例:
运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。 PHP(在一般情况下)不指定评估表达式的顺序,应避免使用假定特定评估顺序的代码,因为行为可以在PHP版本之间或根据周围代码进行更改。
示例#2未定义的评估顺序
<?php $a = 1; echo $a + $a++; // may print either 2 or 3