在PHP中,$++a + $a++ 的含义不明确是什么意思?

8

PHP手册声称:

$a = 1;
echo ++$a + $a++;

这段文本在语法上有些模糊,但对我来说似乎非常清楚。 ++$a 和 $a++ 会首先从左到右进行求值,所以 ++$a 先递增再返回2,$a++ 先返回2再递增。2 + 2 的和是4,所以会输出4。然而,PHP 手册非常明确地表示可能输出4或5。

PHP 规范没有指定操作将从左到右执行吗?即使它不强制要求从左到右执行操作,在这种情况下,它是否仍将返回4?

编辑:我重新阅读了页面,并且它声明是由每个特定的运算符决定的。+ 的优先级最低,从左到右进行评估,所以似乎我的早期假设是正确的。但我仍然不理解。


我同意,我认为它应该始终打印4。 - Matthew
2
可能是为什么$a + ++$a == 2?的重复问题。 - alexisdm
嗯,一开始我也这么认为,但它并没有解释为什么无论如何都不会是4——我有点匆忙了,现在似乎无法取消我的关闭投票。 - nnythm
2个回答

5

++$a表示先将变量$a加1,然后返回加1后的值2;$a++表示先返回变量$a的值2,再将$a加1,所以现在$a的值为3,但是返回的值仍然是2。

在同一个PHP版本中,结果始终相同。但是如果PHP版本更改,则可能产生不同的结果。这取决于哪个表达式先被计算,是++$a还是$a++。如果先计算$a++,则结果将为5,否则结果将为4。


这定义了 $a 的行为,但不解释为什么 echo 可能会显示 4 或 5。 - jprofitt
假设$a++首先被评估。然后$a++评估为1,然后++$a评估为3,1和3的总和为4,因此它仍然不应显示5。 - nnythm

3

请注意,这只是我的个人看法。

我认为这个结果背后的想法是,在只有一个运算符时,没有任何操作数具有优先级,并且在操作中,变量被保留为引用,而不是在所有计算过程中被其结果替换直到最后一个计算(加上,在这个例子中)。所以当它从左到右进行时:

$a = 1;
++$a + $a++
operand 1 --> ++$a ==> $a = ++1 = 2
result (where $a = 2) --> 2 + (2++) = 4

相反,如果没有这样做:

$a = 1;
++$a + $a++
operand 2 --> $a++ ==> $a = 1
// new operation on the left side
// so the value gets incremented ==> $a = 2
result (where $a = 2) --> (++2) + 2 = 5

我不确定这个,但是。


+1 这个答案可能会进一步解释这个问题。 - Wiseguy
这种说法有点合理,但我不知道你为了获得这种功能需要跳过什么样的障碍。 - nnythm

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