以下语句的结果应该给出9 :(使用java或js或c ++)
i = 1;
i += ++i + i++ + ++i;
//i = 9 now
但在php
同样的陈述会给12?!
$i = 1;
$i += ++$i + $i++ + ++$i;
echo $i;
这是一个错误还是任何人都可以解释原因?
答案 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)
差异在于我的想法。