【问题标题】:What would be the output of $a + $a++ + $a++ with $a = 1$a + $a++ + $a++ $a = 1 的输出是什么
【发布时间】:2017-09-27 11:56:27
【问题描述】:

$a = 1 时,表达式echo ($a + $a++ + $a++) 的输出是什么

【问题讨论】:

  • 橡皮鸭,你会弄明白的
  • 大多数从 C 派生的语言(在某种程度上是 PHP)会说它是未定义的行为。这完全取决于操作的顺序。
  • 这就是幕后实际发生的事情:3v4l.org/sqCkW/vld#output
  • 另请注意,$a++++$a 可能会给出不同的结果。

标签: php


【解决方案1】:

用一个更短的例子可能会更好地解释这一点:

$a = 1;
echo $a + $a++;

这看起来应该等于 2。后自增运算符 ($a++) 返回变量的“之前”值,因此它应该返回 1。而 1+1 等于 2。

但是,实际情况是 $a++ 首先得到评估。所以后自增运算符运行,并返回 1,但在其余的评估发生时,$a 已递增到 2。所以这最终会评估 2 + 1

你的例子归结为:

  • 运行第一个 $a++,返回 1。$a 现在是 2;
  • 求和 2 + 1(新的 $a 值和 post-incr 运算符的返回值),返回 3
  • 运行第二个$a++(行尾),返回2(递增前$a的值)。 $a 现在是 3;
  • 计算第二个总和,3 + 2,返回 5

简而言之,请不要编写这样的代码行。如果您想了解 PHP 内部是如何工作的,它们是一个有趣的实验,但它们不是很直观。

编辑添加:@Narf 下面的评论也很重要。这是未定义的行为,不应依赖。事实上,在 PHP https://3v4l.org/sqCkW

【讨论】:

  • 这解释了它是如何工作的ed,但不是一个明确的答案......请参阅我的。
【解决方案2】:

operators precedence 的手册明确将此作为未定义行为的示例:

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

示例 #2 未定义的评估顺序

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2020-02-15
    • 2017-01-30
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多