在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:
> op1 = $a => $a = 2,op1 = 2; op2 = $a => op2 = 2,$a = 3; 2 2 = 4
> op1 = $a => op1 = 1,$a = 2; op2 = $a => op2 = 3,$a = 3; 1 3 = 4
5来自哪里?或者我应该更多地了解操作符的运作方式?
编辑:
我一直盯着Incrementing/Decrementing Operators部分,但仍然无法弄清楚为什么5.
++$a: Pre-increment — Increments $a by one,then returns $a.
$a++: Post-increment — Returns $a,then increments $a by one.
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 preincrements $a,在公式中使用它之前将其设置为2(将结果推送到词法分析器堆栈).然后将词法分析器堆栈的结果和$a的当前值相加,得到4;并且这个值得到了回应.最后,$a是后增量的,在$a中留下3的值.