【问题标题】:why these both post increment in PHP gives the same answer? [duplicate]为什么这两个在 PHP 中的后增量给出了相同的答案? [复制]
【发布时间】:2017-12-12 06:23:31
【问题描述】:

我正在尝试通过 localhost 在 PHP 中运行以下代码,但它给出了意外的输出!

<?php
    $a = 1;
    echo ($a+$a++); // 3
?>

//答案是 3,但由于后增量,答案应该是 2 这是另一个代码,它给出了相同的答案!为什么?

<?php
   $a = 1;
   echo ($a+$a+$a++);
?>

//答案还是3!!!

【问题讨论】:

标签: php post-increment


【解决方案1】:

PHP 手册是这样说的:

运算符优先级和关联性仅决定表达式的分组方式,它们不指定求值顺序。 PHP 没有(在一般情况下)指定表达式的求值顺序,并且应该避免假定特定求值顺序的代码,因为行为可能会在 PHP 版本之间或取决于周围的代码而改变。

所以归根结底,PHP 没有明确定义这些语句类型的最终结果是什么,而且它可能甚至在 PHP 版本之间发生变化。我们将此称为未定义行为,您不应依赖它。

您可能能够在源代码的某处找到选择此顺序的确切原因,但可能没有任何逻辑。

您的两个示例正在评估如下:

<?php
  $a = 1;
  echo ($a + $a++); // 3
?>

真的变成了:

<?php
  $a = 1;
  $b = $a++;
  echo ($a + $b); // a = 2, b = 1
?>

你的第二个例子:

<?php
  $a = 1;
  echo ($a + $a + $a++); // 3
?>

变成:

<?php
  $a = 1;
  $b = $a + $a;
  $a++;
  echo $b + $a; // 3
?>

我希望这种做法是有道理的。你是对的,这背后没有硬性逻辑。

【讨论】:

  • 只有$a+$a++ - 3v4l.org/9Wp8V 的行为似乎是错误的,好像它被评估为 pre 而不是 post。所以它使 OPs example 2 看起来不正常。
  • 在您的第一个示例中,$a 变为 2,但在第二个示例中,它仍为 1。如何?
  • 您解释得很好,但我仍然对您的回答不满意。仍然想知道。
  • @AmitGupta 我想我的例子有点糟糕。我要说明的是在第一个示例中 ($a++) 返回一个,但是在返回一个之后它会递增 $a(因此它变为 2),然后将其添加到递增的值中。号码。
  • @user8196822 抱歉,但我不会去寻找确切负责的 PHP 源代码或这个。我解释了如何,我解释了原因,这就是你从我这里得到的全部 =)
【解决方案2】:

未定义与计算在同一行中的增量操作行为!

编译器可以生成与您预期不同的代码。


老师的简单回答:

切勿在计算中使用递增/递减运算符!

它的行为是不确定的 - 计算机的计算顺序与人类不同。

好:

$d = $i++;
$i++;
for ($i = 0; $i < 5; $i++)

可能是个问题(你可能读错了):

$d = $array[$i++];

将是一个问题:

$d = $i++ + 5 - --$k;

编辑:

我用 C++ 编写了相同的代码。检查的汇编程序代码和结果正如我所说: increment 的数学对人来说不是逻辑,但你不能说有人执行错了。

正如有人在评论中发布的那样:

line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, 1
   3     1        POST_INC                                         ~2      !0
         2        ADD                                              ~3      !0, ~2
         3        ECHO                                                     ~3
  16     4      > RETURN                                                   1

//$a = 1;
//echo ($a+$a++);


line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   ASSIGN                                                   !0, 1
   3     1        ADD                                              ~2      !0, !0
         2        POST_INC                                         ~3      !0
         3        ADD                                              ~4      ~2, ~3
         4        ECHO                                                     ~4
         5      > RETURN                                                   1

//$a = 1;
//echo ($a+$a+$a++);

翻译成人类语言:

$a = 1;
echo ($a + $a++);

// After changing to 'computer logic' (ASM):

$c = 1; // for increment operation
$b = $a; // keep value 'before' add +1 operation
$a += $c; // add +1 operation
$d = $a + $b; // calculate value for 'echo'
echo $d; // print result

【讨论】:

  • 恐怕这不能回答问题。问题是“为什么”。
  • “它的行为未定义” - 它可以根据语言实现而不同。
  • 要充分回答这个问题,您需要解释 php 内部发生了什么。
  • 增量运算符和计算混合使用没有问题只要它们不适用于同一个变量。你的$d = $array[$i++] 是一个非常常见的成语。
  • 恕我直言,如果你看不懂$d = $array[$i++],你不应该是程序员
【解决方案3】:

这是因为++ 符号是变量的增量运算符。所以你的

$a = 1

$a++ = 2

($a+$a++) = (1+2) = 3

这就是为什么它显示 3 作为答案。

【讨论】:

  • 第二个例子呢?????
  • 根据您的回答,第二个示例应该给出输出 4! $a = 1; ($a+$a+$a++) 它没有给出输出 4!
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2019-09-19
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多