如果我尝试这个:
$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:
运算符优先级not确定评价顺序。运算符优先级仅决定表达式$l + ++$l
被解析为$l + (++$l)
,但无法确定左操作数还是右操作数+
首先评估运算符。如果先计算左操作数,则结果将为 0+1,如果先计算右操作数,则结果将为 1+1。
运算符结合性也不决定求值的顺序。那+
运算符具有左结合性仅确定$a+$b+$c
被评估为($a+$b)+$c
。它不确定单个运算符的操作数的计算顺序。
也相关:开这个错误报告 https://bugs.php.net/bug.php?id=61188关于另一个具有未定义结果的表达式,一位 PHP 开发人员说道:“我们不保证求值的顺序 [...],就像 C 不保证一样。您能指出文档中声明第一个结果的任何位置吗?首先评估操作数?”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)