5

请参阅以下代码片段

$i=1;

echo $i.($i++);

很快,我以为结果会是12,但实际结果是21

echo $i,$i++;

我以为它会,12但它的11

echo ($i = ($i++)); //result is 1

echo ($i = ($i+1)); //result is 2

但为什么?

4

4 回答 4

4

当变量不涉及任何算术运算时(如您的第一个$i),PHP 不会创建临时变量。因此,您的第一个$i将在语句结束时进行评估,此时$i++已经执行。

为了防止这种情况,您仍然可以编写:

echo ($i += 0).($i++);

但这显然不是一个好的编码习惯。

编辑:当你使用,它实际上是语法糖来缩短两个 PHP 语句。它严格等同于:

echo $i;
echo $i++;

由于增量是在最后一条语句之后执行的,11确实是结果。

于 2013-10-05T15:45:52.930 回答
2

第一个例子

括号中的代码首先被评估——在这种情况下($i++)。取值$i(1),然后变量递增到 2。所以你就有了这个,这里$i是 2。

echo $i . '1'

由此, 的值$i被代入,你得到'2' . '1',它被连接起来给'21'

第二个例子

重写它以清除,分隔符更容易。该行echo $i, $i++;相当于:

echo $i;
echo $i++;

第一行显然输出1,第二行将输出相同的值,然后递增$i++后递增运算符)。如果你把另一个echo $i;放在最后,它会输出2.

于 2013-10-05T15:58:37.677 回答
1

根据 PHP 文档中所述:运算符优先级

第一个案例

$i=1;

echo $i.($i++);

$i被初始化为值 1。现在,它++遵循更高的优先级,.并且它具有右关联性。这意味着您$i++将首先被评估。在这种情况下, 的值$i++将是1, 的下一个值$i将递增到2。因此$i是 2

现在.在 之后有下一个优先++级,即左结合。因此它将评估从左开始的值。

所以$i=2 和$i++ =1,因此输出 21

第二种情况

$i=1;

echo $i,$i++;

在这里,只有一个运算符++。因此,不需要比较优先级。因此,它将按照左关联的默认标准进行评估。$i = 1, $i++ = 1. 因此11

第三种情况

echo ($i = ($i++)); //result is 1

在这种情况下,now=是一个赋值运算符并且是右结合的,所以$i++ = 1. 并且由于它是赋值运算符的值,$i++因此将存储在$i. 因此 echo ($i = 1);这将导致输出为1.

第四种情况

echo ($i = ($i+1)); //result is 2

同样,这将是右结合的,所以$i+1 = 2. 因此 echo ($i = 2);这将导致输出为2.

于 2013-10-05T16:19:35.717 回答
0

首先它使用第二个位置 $i eq 1 然后将其增加到 2;所以首先它使用 2 和第二个 - 1

于 2013-10-05T15:40:28.267 回答