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中的前置增量和后置增量的主要内容,如果未能解决你的问题,请参考以下文章

PHP中的++$i和$i++有啥区别?

24 小时日期增量 (PHP/Laravel)

增量式pid积分截断效应是怎么回事

SystemC中的增量周期和增量通知是什么?

反应中的setState增量和每个增量1有啥区别[重复]

jenkins+git+maven 增量部署思路以及相关脚本