This question already has answers here:
Why is $a + ++$a == 2?

(13个回答)


已关闭8年。




在PHP手册operator precedence section中,有以下示例:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

我了解由于以下原因,行为未定义:

由于x + y = y + x,解释器可以自由评估xy的添加顺序,以优化速度和/或内存。我在查看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是哪里来的?还是应该更多地了解运算符(operator)的工作方式?

    编辑:

    我一直在盯着Incrementing/Decrementing Operators部分,但仍然不知道为什么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,然后将该值压入lexer堆栈。然后执行$++,因为递增器的优先级比+高,并且该值还将结果插入lexer堆栈;然后进行的加法将词法分析器堆栈的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(将结果插入lexer堆栈)。然后将词法分析器堆栈的结果和$ a的当前值相加在一起得出4;并回显此值。最后,$ a后增加,在$ a中保留3的值。

    10-07 17:44