不直观的expression评估与增量

对于下面的代码

<?php $a=1; $b=$a++; var_dump($b); $a=1; $b=$a+$a++; var_dump($b); $a=1; $b=$a+$a+$a++; var_dump($b); $a=1; $b=$a+$a+$a+$a++; var_dump($b); $a=1; $b=$a+$a+$a+$a+$a++; var_dump($b); 

我获得了这个结果:

 int(1) int(3) int(3) int(4) int(5) 

我预计1,2,3,4,5而不是1,3,3,4,5。 为什么在$a=1; $b=$a+$a++; $a=1; $b=$a+$a++; 我们获得$b=3

PHP 7.1.5-1 + deb.sury.org〜xenial + 1(cli)(built:May 11 2017 14:07:52)(NTS)

 $a=1; $b=$a+$a++; var_dump($b); // int(3) 

认为上面的expression式按从左到右的顺序进行计算(为了清楚起见,在解释中引入了临时variables$u$v ):

  $a = 1; $u = $a; // ($a) the LHS operand of `+` $v = $a; // \ ($a++) the RHS operand of `+` $a ++; // / $b = $u + $v; // 2 (1+1) 

但是不能保证子expression式是按照特定的顺序来评估的 。 PHP运营商的文档页面(重点是我的):

运算符优先级和关联性只能确定expression式如何分组,而不指定评估顺序。 PHP不会(通常情况下)指定expression式的评估顺序,应避免假定特定评估顺序的代码,因为PHP的版本之间的行为可能会发生变化,或者取决于周围的代码。

只有偶然的情况下,PHP为其他expression式计算的值与您所假设的值相匹配。 当使用不同版本的PHP解释器执行代码时,它们的值可能会有所不同。

PHP不会(通常情况下)指定expression式的评估顺序,并且应该避免假定特定的评估顺序的代码[..]

http://php.net/manual/en/language.operators.precedence.php

你得到不同结果的原因是,有时候右边的,有时候左边的操作数是先评估的。 PHP对操作的顺序没有任何保证,所以没有正确的答案,这完全落入了未定义行为的范畴

根据PHP手册

运算符优先级和关联性只能确定expression式如何分组,而不指定评估顺序。 PHP不会(通常情况下)指定expression式的评估顺序,应避免假定特定评估顺序的代码,因为PHP的版本之间的行为可能会发生变化,或者取决于周围的代码。

 <?php $a = 1; echo $a + $a++; // may print either 2 or 3 $i = 1; $array[$i] = $i++; // may set either index 1 or 2 ?> 

奇怪的是,我曾预料其他行像$b=$a+$a+$a++; 遵循相同的模式,但似乎不是。