PHP运算符优先级“未定义的评估顺序”?

时间:2014-03-11 01:01:15

标签: php operator-keyword operator-precedence

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;

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)

评估顺序仅在子表达式可能产生副作用时才会起作用:如果首先评估另一个子表达式,则一个子表达式的值可能会发生变化。