PHP操作符优先级&;字符串浓缩?
请参阅下面的代码片段PHP操作符优先级&;字符串浓缩?,php,Php,请参阅下面的代码片段 $i=1; echo $i.($i++); 很快,我以为结果是12,但实际结果是21 也 我原以为是12,但它是11 echo ($i = ($i++)); //result is 1 echo ($i = ($i+1)); //result is 2 但是为什么呢?首先,对于第二个位置,它使用$i eq 1 然后增加到2; 因此,对于第一个位置,它使用2;对于第二个位置,当一个变量没有涉及到任何算术运算时(如第一个$i),PHP将不会创建临时变量。 因此,当已执行
$i=1;
echo $i.($i++);
很快,我以为结果是12
,但实际结果是21
也
我原以为是12
,但它是11
echo ($i = ($i++)); //result is 1
echo ($i = ($i+1)); //result is 2
但是为什么呢?首先,对于第二个位置,它使用$i eq 1 然后增加到2;
因此,对于第一个位置,它使用2;对于第二个位置,当一个变量没有涉及到任何算术运算时(如第一个
$i
),PHP将不会创建临时变量。
因此,当已执行$i++
时,将在语句末尾对您的第一个$i
进行评估
要防止出现这种情况,您仍然可以编写:
echo ($i += 0).($i++);
但这显然不是一个好的编码实践
EDIT:使用时,缩短两条PHP语句实际上是一种语法上的糖分。它严格等同于:
echo $i;
echo $i++;
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++;
echo $i;
echo $i++;
第一行显然输出了1
,第二行将输出相同的值,然后递增$i
(++
是最大值)。如果您要放置另一个echo$i
最后,它将根据PHP文档输出2
,如下所述:
第一例
$i=1;
echo $i.($i++);
$i=1;
echo $i,$i++;
echo ($i = ($i++)); //result is 1
echo ($i = ($i+1)); //result is 2
$i
已初始化为值1。现在,++
比
具有更高的优先级,并且具有正确的关联性。这意味着您的$i++
将首先被评估。在这种情况下,$i++
的值将是1
,而$i
的下一个值将增加到2
。因此,$i
是2
现在,
在++
之后有一个前导,它是左关联的。因此,它将从左开始计算值
因此,$i
=2和$i++=1
,因此输出21
第二种情况
$i=1;
echo $i.($i++);
$i=1;
echo $i,$i++;
echo ($i = ($i++)); //result is 1
echo ($i = ($i+1)); //result is 2
这里只有一个操作符++
。因此,不需要比较优先级。因此,它将根据左关联的默认标准进行求值<代码>$i=1
,$i++=1
。因此11
第三种情况
$i=1;
echo $i.($i++);
$i=1;
echo $i,$i++;
echo ($i = ($i++)); //result is 1
echo ($i = ($i+1)); //result is 2
在本例中,现在=
是赋值运算符,并且是右关联的,因此$i++=1
。由于它是赋值运算符,$i++
的值将存储在$i
中。因此echo($i=1)代码>将导致输出为1
第四种情况
$i=1;
echo $i.($i++);
$i=1;
echo $i,$i++;
echo ($i = ($i++)); //result is 1
echo ($i = ($i+1)); //result is 2
同样,这将是右关联的,因此$i+1=2
。因此echo($i=2)
这将导致输出为2
如果没有括号怎么办?@Red结果将是same@Red我知道,但现在它不是没有答案的,你说括号中的代码首先计算。然后echo($i=($i++))代码>将是2而不是1。还是我遗漏了什么?在那段代码中,你要取$i
的值,将其递增,然后重新分配旧值-这就是为什么要输出原始值的原因。看起来我有麻烦了。我是这样想的,在检查需要计算为2(1+1)的内括号($I++)
中的代码时,它将该值分配给本地$I,最后将结果作为2进行回显。另请参见我的最新问题:($i++
并不等同于$i+1
。$i++
的值是$i
,但$i
的值随后会增加。也许你在想+$i
?谢谢你的解释。我的大脑被劫持了:)这一点确实帮助了我理解,然而,我已经接受了一个答案(我觉得在这种情况下这样做很糟糕):(