请参阅以下代码段
$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
但为什么?
答案 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)
第一个案例
$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