什么是$ a + $ a ++ + $ a ++的输出,$ a = 1

时间:2017-09-27 11:56:28

标签: php

$a = 1表达式echo ($a + $a++ + $a++)

的输出时

2 个答案:

答案 0 :(得分:3)

用更短的例子可以更好地解释这一点:

$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中确实有所不同< 5.1。见https://3v4l.org/sqCkW

答案 1 :(得分:3)

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

  

运算符优先级和关联性仅确定表达式的分组方式,它们不指定评估顺序。 PHP(在一般情况下)不指定评估表达式的顺序,应避免使用假定特定评估顺序的代码,因为行为可以在PHP版本之间或根据周围代码进行更改。

     

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

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