PHP运算符优先级&字符串连接?

时间:2013-10-05 15:37:58

标签: php

请参阅以下代码段

$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 个答案:

答案 0 :(得分:4)

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

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

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

但这显然不是一个好的编码实践。

编辑:使用,时,缩短两个PHP语句实际上是语法糖。它完全等同于:

echo $i;
echo $i++;

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

答案 1 :(得分:2)

第一个例子

首先评估括号中的代码 - 在本例中为($i++)$i的值取(1)然后变量增加到2.所以你有了这个,$i是2。

echo $i . '1'

从此,$i的值被替换,您得到'2' . '1',它被连接起来以提供'21'

第二个例子

重写此内容以清除,分隔符更容易。第echo $i, $i++;行等同于:

echo $i;
echo $i++;

第一行显然输出1,第二行输出相同的值,然后增加$i++post-increment operator)。如果您要在结尾添加另一个echo $i;,则会输出2

答案 2 :(得分:1)

根据Operator Precedence

中所述的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

在这种情况下,现在=是一个赋值运算符,并且是右关联的,因此$i++ = 1。由于它是一个赋值运算符,$i++的值将存储在$i中。因此echo ($i = 1);将导致输出为1

第四个案例

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

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

答案 3 :(得分:0)

首先,它使用$ i eq 1 然后它增加到2; 所以首先它使用2而第二个 - 1