【问题标题】:How is ++$a + $a++ ambiguous in PHP?++$a + $a++ 在 PHP 中是如何产生歧义的?
【发布时间】:2012-04-05 01:35:50
【问题描述】:

php 手册声称:

$a = 1;
echo ++$a + $a++;

在其语法下是模棱两可的,但对我来说似乎非常清楚。 ++$a 和 $a++ 首先计算,从左到右,所以 ++$a 递增然后返回 2,$a++ 返回 2 然后递增。 2 + 2 之和是 4,所以它会回显 4。但是,The PHP Manual 很清楚地说它可能会打印 4 或 5。

php规范没有规定操作是从左到右吗?

即使它不强制从左到右执行操作,在这种情况下,它不会无论如何都返回4吗?

编辑:我重新阅读了该页面,并指出它是由每个特定的运营商确定的。 + 的优先级最低,并且从左到右进行评估,所以我之前的假设似乎是正确的。我还是不明白。

【问题讨论】:

  • 我同意,我认为它应该总是打印 4。
  • Why is $a + ++$a == 2?的可能重复
  • hmm,一开始我以为是,但它没有解决为什么无论以哪种方式执行它都不会是 4 的原因——我移动有点太仓促了,似乎无法不过现在撤消我的近距离投票。

标签: php grammar interpreter operator-precedence


【解决方案1】:

++$a$a 为 2,并返回 2, $a++ 再次增加 $a,所以 $a 现在是 3,但它返回 2。

在相同的 PHP 版本中,结果总是相同的。但是如果 PHP 版本发生变化,可能会产生不同的结果。这取决于++$a$a++,首先评估哪个。如果先计算$a++,则结果为5,否则结果为4。

【讨论】:

  • 这定义了$a 的行为,但不是echo 可能显示4 或5 的原因。
  • 假设首先评估 $a++。然后 $a++ 计算结果为 1,然后 ++$a 计算结果为 3,并且 1 和 3 的和为 4,所以它应该永远不会显示 5。
【解决方案2】:

请注意,这只是我的拙见。

我认为这个结果背后的想法是,当只有一个运算符时,没有任何一个附加数具有优先权,并且在一个操作中,一个变量被保留作为参考,而不是在所有计算期间被它的结果替换,直到最后一个(加上,在这个例子中)。所以当它从 l-r 开始时:

$a = 1;
++$a + $a++
operand 1 --> ++$a ==> $a = ++1 = 2
result (where $a = 2) --> 2 + (2++) = 4

否则:

$a = 1;
++$a + $a++
operand 2 --> $a++ ==> $a = 1
// new operation on the left side
// so the value gets incremented ==> $a = 2
result (where $a = 2) --> (++2) + 2 = 5

不过,我不确定。

【讨论】:

  • +1 This answer 可能有助于进一步解释这一点。
  • 这种说法是有道理的,但我不知道你必须跳过什么样的圈才能获得这个功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多