http://www.php.net/manual/en/language.operators.precedence.php#example-115
<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3
?>
php手册中的例子并不能很好地解释。为什么$a++
未评估为2
,然后添加到1
,以便它始终变为echo 1 + 2 // equals 3
?我不明白它是如何“打印2或3”。我认为增量++
比添加+
具有“更高的优先级”?
换句话说,我不明白为什么不是......
$a = 1;
1) echo $a + $a++;
2) echo 1 + ($a = 1 + 1);
3) echo 1 + (2);
4) echo 3;
答案 0 :(得分:1)
它可以是2或3.但是在大多数情况下它将是3.那么为什么它可能是2?因为PHP没有描述评估表达式的顺序,因为它可能取决于PHP版本。
答案 1 :(得分:1)
PHP中的运算符优先级很乱,并且它可能会在不同版本之间发生变化。出于这个原因,最好使用括号对您的内联方程进行分组,以便它们的执行没有歧义。
当我被问到这个问题时,我通常给出的例子是反过来询问这个等式的答案:
$a = 2;
$b = 4;
$c = 6;
$val = $a++ + ++$b - 0 - $c - -++$a;
echo $val;
:)
根据我现在运行的地方,我得到4到7之间的任何内容,或者解析器错误。
这会将$ a(1)加载到内存中,然后再将其加载到内存中并递增它(1 + 1),然后将两者加在一起,给你3:
$a = 1;
$val = $a + ($a++);
然而,这是一个解析器错误:
$a = 1;
$val = ($a + $a)++;
无论如何,长话短说,您的示例2)
是大多数版本解释它的方式,除非您在($a++)
周围添加括号,如上例所示,这将使其以相同的方式运行所有支持增量运算符的PHP版本。 :)
答案 2 :(得分:1)
评估的顺序不是优先问题。它与运营商无关。函数调用也会出现问题。
顺便说一句,$a++
会返回$a
的旧值。在您的示例中,$a++
的计算结果为1,而不是2。
在以下示例中,PHP未定义首先评估哪个子表达式:$a
或$a++
。
$a = 1;
f($a, $a++); //either f(1,1) or f(2,1)
优先顺序是关于放在括号中的位置。括号不能改变评估顺序。要修复评估问题的顺序,您需要将代码分成多行。
$a = 1;
$a0 = $a;
$a1 = $a++;
f($a0, $a1); //only f(1,1)
评估顺序仅在子表达式可能产生副作用时才会起作用:如果首先评估另一个子表达式,则一个子表达式的值可能会发生变化。