不直观的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式的评估顺序,并且应该避免假定特定的评估顺序的代码[..]
你得到不同结果的原因是,有时候右边的,有时候左边的操作数是先评估的。 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++;
遵循相同的模式,但似乎不是。