9

在 PHP 手册,运算符优先级部分,有这个例子:

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

我了解该行为未定义,原因如下:

因为解释器可以自由地以任何顺序x + y = y + x评估x和添加,以优化速度和/或内存。在查看本文中的 C 代码示例y后,我得出了这一结论。

4我的问题是,无论表达式和子表达式的评估方式如何,上述 PHP 代码的输出都应该是:

  • 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从哪里来?或者我应该更多地了解操作员的工作方式?

编辑:

我一直盯着递增/递减运算符部分,但仍然无法弄清楚为什么 5。

++$a: Pre-increment -- 将 $a 加一,然后返回 $a。
$a++: 后增量——返回 $a,然后将$a 加一。

4

3 回答 3

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 的值。

于 2013-01-02T07:26:14.330 回答
1

是的,它会给你 5,因为右侧运算符首先按其优先级/优先级工作,然后 sum(+) 运算符将工作。因此,第一个增量使其变为 2,第二个增量变为 3,然后两者都将求和并将结果输出为 5

$result = ++$a + $a++;

++$a输出为 2

$a++仅输出为 2 3 但在内部它将递增。

最后总和将发生为 2+3 = 5

于 2013-01-02T07:29:39.080 回答
0

马克,我相信你错了!

后增量:返回 $a,然后将 $a 加一。(来自文档)

所以没有办法在 sum 运算中得到 $a 的值 3。

于 2013-01-02T08:49:33.390 回答