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

2024-01-21

如果我尝试这个:

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

我得到这个输出:

2
1

Demo: http://codepad.org/ncVuJtJu http://codepad.org/ncVuJtJu

这是为什么?

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

1
1

我的理解:

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

但为什么输出不是这样呢?


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

See 示例1 http://php.net/manual/en/language.operators.precedence.php#example-111,其中说:

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

Notes:

  1. 运算符优先级not确定评价顺序。运算符优先级仅决定表达式$l + ++$l被解析为$l + (++$l),但无法确定左操作数还是右操作数+首先评估运算符。如果先计算左操作数,则结果将为 0+1,如果先计算右操作数,则结果将为 1+1。

  2. 运算符结合性也不决定求值的顺序。那+运算符具有左结合性仅确定$a+$b+$c被评估为($a+$b)+$c。它不确定单个运算符的操作数的计算顺序。

也相关:开这个错误报告 https://bugs.php.net/bug.php?id=61188关于另一个具有未定义结果的表达式,一位 PHP 开发人员说道:“我们不保证求值的顺序 [...],就像 C 不保证一样。您能指出文档中声明第一个结果的任何位置吗?首先评估操作数?”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么$a + ++$a == 2? 的相关文章