PHP中的预增量和后增量

时间:2012-07-11 12:43:53

标签: java php javascript

以下语句的结果应该给出9 :(使用java或js或c ++)

i = 1;
i += ++i + i++ + ++i;
//i = 9 now

但在php

同样的陈述会给12?!

$i = 1;
$i +=  ++$i + $i++ + ++$i;
echo $i;

这是一个错误还是任何人都可以解释原因?

5 个答案:

答案 0 :(得分:7)

答案是“因为它是PHP”。 PHP并不保证这种类型的语句(顺便说一句,C也没有)。

是的,它可能被认为是错误的,但它是PHP。请参阅this "not a bug" bug report

答案 1 :(得分:7)

查看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

答案 2 :(得分: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个。

答案 3 :(得分:2)

无法保证这些增量的顺序。为什么写代码含糊不清?

答案 4 :(得分: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)

差异在于我的想法。