PHP中的后置自增和前置自增

4

我在PHP中发现了一些奇怪的计算,例如:

$c=5;

$r = $c + ($c++ + ++$c);

echo $r;

为什么结果是19而不是17?谢谢。

2
{btsdaf} - Jay Blanchard
1个回答

3
结果应该是未指定的。请阅读以下PHP规范:
https://github.com/php/php-langspec/blob/master/spec/10-expressions.md

虽然优先级,结合性和分组括号控制操作符应用的顺序,但它们不控制术语本身的评估顺序。除非在此规范中明确说明,否则表达式中操作数相对于彼此的评估顺序是未指定的。请参见上述关于包含序列点的运算符的讨论。(例如,在完整表达式$list1[$i] = $list2[$i++]中,左侧的$i的值是旧的还是新的$i,是未指定的。同样,在完整表达式$j = $i + $i++中,$i的值是旧的还是新的$i,是未指定的。最后,在完整表达式f() + g() * h()中,三个函数调用的顺序是未指定的)。

你可以在PHP文档中找到相同的推理: 输入图像描述

{btsdaf} - Tarun
1
在编程中,未定义的结果意味着结果可能会因环境或PHP版本而异。请告诉我为什么您认为文档中给出的示例与问题无关。我还建议您阅读有关序列点的内容。 - Tarun
4
出于好奇,https://3v4l.org/bBZQ3 的结果在以下版本中为19:5.1.0 - 5.6.30、hhvm-3.10.1 - 3.22.0、7.0.0 - 7.2.0rc4。在版本4.3.0 - 5.0.5中为17。 - SubjectCurio
2
{btsdaf} - Tarun
2
{btsdaf} - Tarun
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接