为什么 $a + ++$a == 2?

2022-08-30 09:07:55

如果我试试这个:

$a = 0;    
echo $a + ++$a, PHP_EOL;
echo $a;

我得到这个输出:

2
1

演示:http://codepad.org/ncVuJtJu

为什么?

我希望得到这个作为输出:

1
1

我的理解:

$a = 0;                    // a === 0    
echo $a + ++$a, PHP_EOL;   // (0) + (0+1) === 1
echo $a;                   // a === 1

但为什么这不是输出呢?


答案 1

所有解释为什么你得到2而不是1的答案实际上都是错误的。根据PHP文档,混合和以这种方式是未定义的行为,因此您可以获得1或2。切换到不同版本的PHP可能会改变你得到的结果,而且它同样有效。+++

请参阅示例 1,其中说:

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

笔记:

  1. 运算符优先级决定计算顺序。运算符优先级仅确定表达式被分析为 ,而不确定是首先计算运算符的左操作数还是右操作数。如果首先计算左操作数,则结果将为 0+1,如果首先计算右操作数,则结果将为 1+1。$l + ++$l$l + (++$l)+

  2. 运算符关联性也不决定评估的顺序。运算符已离开关联性仅确定其计算为 。它不确定单个运算符的操作数的计算顺序。+$a+$b+$c($a+$b)+$c

同样相关的是:关于另一个结果未定义表达式的错误报告,一位PHP开发人员说:“我们不保证评估的顺序[...],就像C不保证一样。你能指出文档中的任何地方,说明首先评估第一个操作数吗?


答案 2

增量前运算符“++”在计算它所在的表达式的其余部分之前发生。所以它实际上是:

echo $l + ++$l; // (1) + (0+1) === 2

推荐