PHP中的预增量和后增量

5
以下语句的结果应该为9:(使用Java或JS或C++)
i = 1;
i += ++i + i++ + ++i;
//i = 9 now

但是在 PHP 中,相同的语句会得到 12 ?!
$i = 1;
$i +=  ++$i + $i++ + ++$i;
echo $i;

这是一个bug还是有人可以解释一下为什么?
5个回答

7
答案是“因为它是PHP”。而且PHP不保证这种类型的语句(顺便说一句,C语言也是如此)。是的,这可能被认为是错误的,但是这是PHP。请参见这个“不是bug”的bug报告

7

点击这里看类似的例子。

基本上是这样的:

首先,计算++$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


顺便说一句,解释得很好,但我知道它是如何评估的,问题是为什么!我认为我们不能依赖PHP进行这样的操作。 - amd
@Ahmad 只要不写出这样的代码,你就没问题了。 - Matsemann
@Ahmad:为什么会这样实现是一个很难回答的问题,除了他们选择以这种方式实现之外,别无他法。 - Keppil

4
根据操作符优先级文档:
// 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。

2

这些增量的顺序没有任何保证。为什么要编写不明确的代码呢?


这并不含糊。无论运行多少次,我保证你会得到相同的结果。它有非常明确定义的增量顺序,只是不是立即显而易见的。 - Vala
因此,它是模棱两可的——一开始不清楚正在做什么。为什么要编写代码,一开始就不明显地知道正在实现什么。@Thor84no-以维护代码的人的身份回到这段代码,并尝试弄清楚哪里出了问题。 - Ed Heal
2
不要混淆“模棱两可”和“不可重现”。当然,使用相同的PHP实现可以重现结果。但是,它仍然是模棱两可的,因为语言规范没有定义PHP处理器如何处理它,所以这取决于PHP的实现者。 - Heiko Schmitz

1

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)

区别在于我认为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接