在PHP手册operator precedence section中,有一个例子:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
我理解行为未定义,原因如下:
由于x + y = y + x
,解释器可以自由评估x
和y
以便以任何顺序添加,以优化速度和/或内存。我在查看C code example in this article后得出结论。
我的问题是,无论表达式和子表达式的评估方式如何,上述PHP代码的输出应为4
:
5来自哪里?或者我应该更多地了解操作员的工作方式吗?
编辑:
我一直盯着Incrementing/Decrementing Operators部分,但仍然无法弄清楚为什么5。
++ $ a:预增量 - 按$增加$ a, 然后 返回$ a。
$ a ++:后增量 - 返回$ a, 然后 将$ a递增一个。
答案 0 :(得分:5)
a = 1;
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement)
++ (postincrement) gives a = 3 (higher precedence than +)
+ (add) gives 2 + 3 = 5
$ a最初设置为1. ++ $ a然后在公式中使用它之前预先增加$ a,将其设置为2,并将该值推送到词法分析器堆栈。然后执行$ ++,因为incrementor的优先级高于+,并且该值也被推送到词法分析器堆栈;然后发生的加法将词法分析器堆栈2的结果添加到词法分析器堆栈3的结果,结果为5,然后回显。一旦执行该行,$ a的值为3。
或强>
a = 1;
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement)
+ (add) gives 2 + 2 = 4 (the value that is echoed)
++ (postincrement) gives a = 3 (incremented __after__ the variable is echoed)
$ a最初设置为1.当公式解析时,++ $ a预先增加$ a,在公式中使用它之前将其设置为2(将结果推送到词法分析器堆栈)。然后将词法分析器堆栈的结果和$ a的当前值相加,得到4;并且这个值得到了回应。最后,$ a是后增量的,在$ a中留下3的值。
答案 1 :(得分:1)
是的,它会给你5,因为右侧操作员首先按其优先级/优先级工作,之后sum(+)操作符将起作用。 因此,第一个增量使其为2,第二个使其为3,之后两者将相加并输出结果为5
$result = ++$a + $a++;
++$a
输出为2
$a++
仅输出2 3但在内部它将递增。
最后总和将发生在2 + 3 = 5
答案 2 :(得分:0)
后增量:返回$ a,然后将$ a递增1。 (来自文档)
所以在总和操作中无法获得$ 3的值。