php-增量式不直观的表达式求值

对于以下代码

<?php

$a=1;   $b=$a++;              var_dump($b);
$a=1;   $b=$a+$a++;           var_dump($b);
$a=1;   $b=$a+$a+$a++;        var_dump($b);
$a=1;   $b=$a+$a+$a+$a++;     var_dump($b);
$a=1;   $b=$a+$a+$a+$a+$a++;  var_dump($b);

我得到了这个结果:

int(1)
int(3)
int(3)
int(4)
int(5)

我期望1,2,3,4,5而不是1,3,3,4,5。 为什么在$a=1; $b=$a+$a++;之后获得$b=3

PHP 7.1.5-1 + deb.sury.org〜xenial + 1(cli)(建立:2017年5月11日14:07:52)(NTS)

Daniel asked 2020-06-29T23:01:27Z
3个解决方案
30 votes
$u

您假定上面的表达式按从左到右的方式进行如下评估(为清楚起见,在临时说明中引入了临时变量$u和2944971803632075075777):

 $a = 1;
 $u = $a;              //    ($a)   the LHS operand of `+`
 $v = $a;              //  \ ($a++) the RHS operand of `+`
 $a ++;                //  /
 $b = $u + $v;         // 2 (1+1)

但是,不能保证子表达式按指定的顺序求值。 PHP运算符的文档页面指出(重点是我的):

运算符的优先级和关联性仅决定表达式的分组方式,而不指定计算顺序。 PHP不(一般情况下)不指定按哪个顺序评估表达式,而应避免采用假定特定评估顺序的代码,因为行为可能在PHP版本之间或取决于周围的代码而改变。

仅偶然地,PHP为其他表达式计算的值与您假定的值匹配。 当使用不同版本的PHP解释器执行代码时,它们的值可能不同。

axiac answered 2020-06-29T23:01:57Z
23 votes

PHP没有(一般情况下)没有指定表达式的计算顺序,应避免采用假定特定计算顺序的代码[..]

[HTTP://PHP.net/manual/恩/language.operators.precedence.PHP]

您得到不同结果的原因是,有时会首先评估右侧和左侧操作数。 PHP无法保证操作顺序,因此没有正确答案,这正好属于未定义行为的范畴。

deceze answered 2020-06-29T23:02:26Z
10 votes

根据PHP手册

运算符优先级和关联性仅决定表达式如何 分组,它们没有指定评估顺序。 PHP不 (通常)指定表达式的顺序 被评估的代码和假定特定评估顺序的代码应 避免使用,因为行为可能会在PHP版本或 取决于周围的代码。

<?php
$a = 1;
echo $a + $a++; // may print either 2 or 3

$i = 1;
$array[$i] = $i++; // may set either index 1 or 2
?>

奇怪的是,我曾期望像$b=$a+$a+$a++;之类的其他行遵循相同的模式,但似乎并非如此。

Salketer answered 2020-06-29T23:02:56Z
translate from https://stackoverflow.com:/questions/46054682/unintuitive-expression-evaluation-with-incrementation