来源
运算符优先级 Example #2 Undefined order of evaluation
原文
Operator precedence and associativity only determine how expressions are grouped, they do not specify an order of evaluation. PHP does not (in the general case) specify in which order an expression is evaluated and code that assumes a specific order of evaluation should be avoided, because the behavior can change between versions of PHP or depending on the surrounding code.
Example #2 Undefined order of evaluation
<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3
$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>
翻译
运算符的优先级和结合性可以用来帮我们对一个表达式进行拆解,但不指定赋值顺序。一般情况下,PHP不指定求值表达式的顺序。我们也应该避免使用这种基于特定求值顺序的代码。因为基于不同的PHP版本或关联代码,可能会有不同的产生不同的行为。
再解释
- 在 不同PHP版本在线测试工具 中,可以测试得到『$a + $a++』在 5.0.5 及以下版本中结果为 2,更高版本中,结果为 3 。
- 『++』的优先级是高于『+』,这是毋庸置疑的;而根据『++』的定义,$a 应该是使用了原值,再进行『++』操作。
- 那么,要对『$a + $a++』的结果为2或3做解释,只有这样:
整个表达式结果为2:第一、二个$a值均为1,得到表达式结果为2;再$a++。
整个表达式结果为3:第二个$a值为1;$a++,$a值变为2;第一个$a值为2。
总结
PHP语言在设计时,没有考虑过『++』或『--』运算符同『表达式求值』完全分离(比如说『++』在变量后的话,就在整个表达式得到值(过程中忽略自增)后,再自增),不同PHP版本存在不同的实现策略,导致同一个表达式可能会有不同的值。
实际开发中,表达式中如果使用了『++』或『--』,那么对应的变量在该表达式中不应该出现大于1次。