为什么 $x=5; $x+++$x++;等于 PHP 中的 11?

Why $x=5; $x+++$x++; equals with 11 in PHP?

根据操作码,它应该是 12。我理解错了吗?

number of ops:  8
compiled vars:  !0 = $x
line    #* E I O op                  fetch      ext   return  operands
-------------------------------------------------------------------------
  3     0  E >   EXT_STMT                                                 
        1        ASSIGN                                         !0, 5
  5     2        EXT_STMT                                                 
        3        POST_INC                               ~2      !0
        4        POST_INC                               ~3      !0
        5        ADD                                    ~4      ~2, ~3
        6        ECHO                                           ~4
  7     7      > RETURN                                         1

branch: #  0; line:     3-    7; sop:     0; eop:     7; out1:  -2
path #1: 0,

编辑

还有($x++)+($x++); returns 同样的结果 (11)。实际上这是问题和操作码调查的主要原因。

post 递增运算符递增变量,但 returns 它的旧值。

所以$x++等同于:

($temp = $x, $x = $x + 1, $temp)

当你在一个表达式中执行两次时,就像:

echo ($temp1 = $x, $x = $x + 1, $temp1) + ($temp2 = $x, $x = $x + 1, $temp2);

第一部分设置$temp1 = 5并将$x增加到6

第二部分设置$temp2 = 6并将$x增加到7。

然后它执行 $temp1 + $temp2 并回显结果,即 5 + 6 = 11

$x = 5;
$a = $x++ + $x++;

表达式行会这样执行: 语句中第一次出现 $x++ 将使 $x 值增加 1,因此它将变为 6 和

在第二次出现时,$x 的值为 6;

所以 $a = 5 + 6;

所以最终结果 $a 将是 11。

我读了几遍,但 $x=5; $x++ + $x++; 是这样工作的:

对于$x++,它首先'gets used',然后增加:

  • 将 $x 设置为 5
  • 将 $x 放入堆栈(即 5)
  • 增量(++) ($x 现在是 6, stack=[5])
  • 将$x 加入堆栈 (stack=[5,6], 所以 5+6 -> $x=11)
  • 添加完成,结果为 11
  • 增加 $x(++)(不再使用,但 $x 现在是 7)

实际上,在这个具体的例子中,如果你愿意 echo $x; 它会输出 7。您永远不会将该值重新分配回 $x,因此 $x=7(您将其递增两次);

++ 的优先级高于 + 运算符

(x++) 将 return x 的值先增加 1

$x = 2
$x++ // return 2, then increment it to 3

x+++x++ 的计算如下

1. Get x value first which is 5
2. Then it will be incremented to 6
3. But first x value will be 5 because (x++) statement will return 5 first then increment the value
4. Then + operator is encountered
5. Next x will have 6 as value not 7 for the same reason (x++) will return the x value first and then increment it
6. So 5+6 is 11
7..At the end, x value will be 7

($x++)+($x++)

也一样

grouping operator () 具有 left to right 关联性。首先 ($x++) 先执行。

$x = 5
($x++) returns 5 and then increment $x by 1. Same as before. 

然后执行最后一个 ($x++)。它 returns 6 然后递增 $x 到 7

所以 5+6 // 11 被 return 退回了

$x = 5;
echo $x++ + $x++;

打印 11 作为第一个 $x++ returns 5 ,然后它递增,第二个 $x++ returns 6 和递增的唯一值。所以实际加法是 5+6 得到 11.

++$x + $x++ 将是 12

++$x + ++$x 将是 13

当你使用 $x++ $x 时,一旦它的值被使用,它就会得到 +1,但是将要使用的值是它在增量之前的值,所以当你这样做时:

$x=5; $x+++$x++;

$x+++$x++ 为 11,但 $x 将为 7

您正在使用 post 增量运算符 ($x++)。如果你想使用增量值进行加法,你应该使用预增量运算符 (++$x).

因此如果 $x = 5

$x++ + $x++ equals 5+6 = 11
++$x + $x++ equals 6+6 = 12
$x++ + ++$x equals 5+7 = 12
$++x + ++$x equals 6+7 = 13

然而在所有情况下,x 之后都等于 7。