为什么 $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。
根据操作码,它应该是 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。