请参阅以下代码片段
$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
但为什么?
请参阅以下代码片段
$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
但为什么?
当变量不涉及任何算术运算时(如您的第一个$i
),PHP 不会创建临时变量。因此,您的第一个$i
将在语句结束时进行评估,此时$i++
已经执行。
为了防止这种情况,您仍然可以编写:
echo ($i += 0).($i++);
但这显然不是一个好的编码习惯。
编辑:当你使用,
它实际上是语法糖来缩短两个 PHP 语句。它严格等同于:
echo $i;
echo $i++;
由于增量是在最后一条语句之后执行的,11
确实是结果。
括号中的代码首先被评估——在这种情况下($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
.
根据 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
.
首先它使用第二个位置 $i eq 1 然后将其增加到 2;所以首先它使用 2 和第二个 - 1