【问题标题】:PHP operator precedence "Undefined order of evaluation"?PHP运算符优先级“未定义的评估顺序”?
【发布时间】:2014-04-14 09:34:22
【问题描述】:

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;

【问题讨论】:

  • 它被明确记录为未定义,因为他们不希望您依赖当前的内部实现。哪个确实最近从 PHP 5.0.x 更改为 5.1。优先级没有实际价值。或者您是否有专门依赖这种边缘案例的真实世界代码?
  • 这种情况,$a = 1,$a + $a + $a++$a + $a++ 都等于 3。看起来很奇怪。我认为$a++ 总是首先评估,因为优先级更高,但我错了……有点混乱。

标签: php operator-keyword operator-precedence


【解决方案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】:

    它可以是 2 或 3。但是在大多数情况下它会是 3。那么为什么它可能是 2?因为 PHP 没有描述表达式的求值顺序,因为它可能取决于 PHP 版本。

    【讨论】:

      【解决方案3】:

      评估的顺序 不是优先问题。它与运营商无关。函数调用也会出现问题。

      顺便说一下,$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)
      

      仅当您的子表达式可能对彼此产生副作用时,评估顺序才重要:如果先评估另一个子表达式,则一个子表达式的值可能会改变。

      【讨论】:

        猜你喜欢
        • 2016-12-31
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 2014-01-17
        • 2018-03-28
        • 2011-05-11
        • 2012-08-10
        • 2019-06-05
        相关资源
        最近更新 更多