【问题标题】:Why $x=5; $x+++$x++; equals with 11 in PHP?为什么 $x=5; $x+++$x++;等于 PHP 中的 11?
【发布时间】:2023-03-19 05:19:01
【问题描述】:

根据操作码应该是 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++);返回相同的结果 (11)。实际上这是问题和操作码调查的主要原因。

【问题讨论】:

  • 从编辑中的示例看来 () 对 POST_INC 操作没有影响。
  • 这段代码既不可读也不有用。下一个 PHP 版本可以更改该行为。代码更简洁,让每个人都有机会理解它。
  • 这个问题与 PHP 的工作原理有关,与代码质量无关。
  • 再一次。这是一个无用的问题,因为代码不清晰,并且可以通过 PHP 随时更改以摆脱这种混乱。 Interesting article - 已经 6 岁了,许多问题都已解决,但很多问题还没有解决。我认为在这个巴比伦项目 PHP 中问这样的问题是没有用的。
  • 对我来说不是没用。编辑完成它。为什么 () 不改变预期的行为?

标签: php opcode


【解决方案1】:

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

在 $x++ 的情况下,它首先“被使用”,然后增加:

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

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

【讨论】:

  • 那么 ($x++)+($x++) 呢?它仍然返回 11。
  • 同样的原理,Stack ($x), then ++ it ([5], $x=6), stack ($x), then ++ it ([5,6], $x=7)。括号根本不重要(令人困惑,我知道)
  • @Emil 试试++$x + ++$x 看看魔法吧。还要尝试理解“前增量”和“后增量”
【解决方案2】:
$x = 5;
$a = $x++ + $x++;

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

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

所以 $a = 5 + 6;

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

【讨论】:

    【解决方案3】:

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

    (x++) 将首先返回 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++)。它返回 6,然后将 $x 增加到 7

    所以返回相同的5+6 // 11

    【讨论】:

    • 那么 ($x++)+($x++) 呢?它仍然返回 11。
    • 分组运算符() 具有从左到右的结合性。所以 left ( ) 将首先执行,然后是正确的。所以同样的情况发生了
    【解决方案4】:

    您正在使用后增量运算符 ($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。

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

        【解决方案6】:
        $x = 5;
        echo $x++ + $x++;
        

        打印 11,因为第一个 $x++ 返回 5,然后递增,第二个 $x++ 返回 6,唯一的值递增。所以实际加法是 5+6 得到 11。

        【讨论】:

          【解决方案7】:

          后自增运算符递增变量,但返回其旧值。

          所以$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

          【讨论】:

            猜你喜欢
            • 2021-09-21
            • 2013-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-24
            • 2018-06-13
            • 1970-01-01
            • 2015-05-07
            相关资源
            最近更新 更多