PHP中的前置增量和后置增量
Posted
技术标签:
【中文标题】PHP中的前置增量和后置增量【英文标题】:pre-increment and post-increment in PHP 【发布时间】:2012-07-11 02:06:57 【问题描述】:以下语句的结果应该是 9:(使用 java 或 js 或 c++)
i = 1;
i += ++i + i++ + ++i;
//i = 9 now
但在 php 中
相同的语句将给出 12 ?!
$i = 1;
$i += ++$i + $i++ + ++$i;
echo $i;
这是一个错误还是任何人都可以解释原因?
【问题讨论】:
【参考方案1】:答案是“因为它是 PHP”。而且 PHP 不保证这种类型的语句(顺便说一句,C 也不保证)。
是的,它可能被认为是错误的,但它是 PHP。见this "not a bug" bug report。
【讨论】:
【参考方案2】:无法保证这些增量的顺序。为什么要编写模棱两可的代码?
【讨论】:
这不是模棱两可的。运行一百万次,我保证你会得到相同的结果。它有一个非常明确的增量顺序,只是这个顺序不是很明显。 .. 因此是模棱两可的 - 从一开始就不清楚正在做什么。为什么要编写一开始对于要实现的目标并不明显的代码。 @Thor84no - 以维护代码的人的身份回到这段代码并尝试找出哪里出了问题。 不要将“模棱两可”与“不可复制”混为一谈。当然,可以使用相同的 PHP 实现来重现结果。但是,它仍然是模棱两可的,因为语言规范没有定义 PHP 处理器如何处理它,所以这取决于 PHP 的实现者。【参考方案3】:查看here 以获取类似示例。
基本上是这样的:
首先评估++$i
。 $i
现在是 2。$i += 2 + $i++ + ++$i;
接下来,评估$i++
。 $i
现在是 3。$i += 2 + 2 + ++$i;
接下来,评估++$i
。 $i
现在是 4。$i += 2 + 2 + 4;
最后计算总和:$i = 4 + 2 + 2 + 4 = 12
【讨论】:
btw 很好的解释,但我知道它是如何评估的,但问题是为什么!我认为我们不能依赖 PHP 进行这样的操作 @Ahmad 只是不要写这样的代码,你应该没问题。 @Ahmad:除了他们选择以这种方式实施之外,“为什么”是一个很难回答的问题。【参考方案4】:根据Operator Precedence 上的文档:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
所以我猜发生了什么:
$i += ++$i + $i++ + ++$i;
翻译成
$i = (++$i + $i++ + ++$i) + $i;
在这种情况下,加起来是 12。
【讨论】:
【参考方案5】:Java、JS 或 C++ 是这样计算这个等式的;
i = 1;
i += ++i + i++ + ++i; --> i = i* + ++i + i++ + ++i (i* is 1 all the time)
但在 PHP 中:
$i = 1;
$i += ++$i + $i++ + ++$i; --> $i = $i* + ++$i + $i++ + ++$i ($i* is calculated after increments, in your situation $i* is 4)
区别在于我认为。
【讨论】:
以上是关于PHP中的前置增量和后置增量的主要内容,如果未能解决你的问题,请参考以下文章