【问题标题】:PHP exponentiation operator precedencePHP 求幂运算符优先级
【发布时间】:2017-07-19 19:15:44
【问题描述】:

我阅读了PHP.net docs,其中指出:

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

但是当我运行这段代码时,我得到了意想不到的输出:

<?php
$a = 2;
echo(++ $a ** 2); 
// output: 9, means: (++$a) ** 2
// expected: 5, means: ++($a ** 2)

你能帮我弄清楚为什么会这样吗?谢谢!

【问题讨论】:

  • 也许尝试将加号放在$a - ($a++ ** 2) 之后。 ++$i 是预增量,而 $i++ 是后增量。
  • 是的,您的代码按预期工作(先指数,然后递增)。我想知道为什么我的代码没有(至少与文档所说的相比)。
  • 运算符优先级和关联性仅决定表达式的分组方式,它们不指定求值顺序。
  • AbraCadaver 说得通。我在这件事上找到了这篇文章:gist.github.com/nikic/6699370
  • echo($a++ ** 2); 给我4 然后echo($a) 给我3。所以PHP内部评估($a ** 2)并返回结果。在稍后阶段,它会更新 $a 的值。

标签: php operators operator-precedence


【解决方案1】:

这是因为++$a 是前置增量,$a++ 是后置增量。

你可以阅读更多关于这个here

还有,

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

发件人:PHP Operator Precedence

【讨论】:

  • echo($a++ ** 2); 给了我与echo($a ** 2); (php 7.1) 相同的值,这个接缝无效..
  • 非常有趣的echo($a++ ** 2); 给了我4 但随后echo($a) 给了我3。所以 php 首先执行($a ** 2) 并返回该结果。之后它在内部设置$a 的有效值
  • 好吧,代码没有将$a++ 设置为等于任何值,换句话说,$a 实际上并没有改变,因为没有存储回原来的值——除非我误解了你的评论
【解决方案2】:

我很确定,这里的文档是错误的。

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

这句话似乎与分组遵循运算符优先级的方式相矛盾。

运算符优先级和关联性仅决定表达式的分组方式,它们不指定求值顺序。

事实上,如果我们将** 分组在++ 之前,我们将获得++($a ** 2),就像问题中所述。但是这个表达式甚至无效,因为++ 运算符只能用于变量,而不能用于表达式。

++ 仅对变量有效这一事实意味着没有两个操作数的运算符可以具有更高的优先级。

【讨论】:

    【解决方案3】:

    似乎发生的事情是 Post/Pre 增量在操作之外进行评估。所以**被执行并返回结果。

    • 对于后增量,$a 变量在操作后更新。
    • 对于预增量,$a 变量在操作之前更新。

    所以文档

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

    对我来说似乎有点奇怪。

    经过一番搜索,cmets 中也提到了这一点: http://php.net/manual/en/language.operators.increment.php#119098

    在文档本身中。

    <?php
    // POST
    $a = 2;
    echo($a ** 2);      // 4
    echo(PHP_EOL);
    echo($a++ ** 2);    // 9
    echo(PHP_EOL);
    echo($a);           // 3
    echo(PHP_EOL);
    echo(PHP_EOL);
    
    // PRE
    $a = 2;
    echo($a ** 2);      // 4
    echo(PHP_EOL);
    echo(++$a ** 2);    // 4
    echo(PHP_EOL);
    echo($a);           // 3
    echo(PHP_EOL);
    echo(PHP_EOL);
    

    【讨论】:

    • 这不是和我的回答基本一样吗?除了我的解释,优先级实际上并没有设置评估顺序
    • 不,因为echo($a++ ** 2) 除了答案5 而不是4
    • 所以我拿出我提供的代码,我们有相同的答案,而你的没有解释优先级!= 评估,因此你的答案实际上并没有回答所提出的问题
    • 是的,在您的答案中指向 stackoverflow 答案的链接中,您可以看到表格 :) 这是最重要的部分
    • 是的哈哈我对4 有点困惑,但仍然存在一个问题,** 运算符何时优先于 OP 链接的页面上记录的++
    【解决方案4】:

    空格,这就是为什么!

    ++ $a ** 2不同于++$a ** 2,也就是不同于++$a**2

    【讨论】:

    • 不,这不是原因。
    猜你喜欢
    • 2012-08-10
    • 2018-04-02
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-06-21
    相关资源
    最近更新 更多