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
?谢谢你的解释。我的大脑被劫持了:)这一点确实帮助了我理解,然而,我已经接受了一个答案(我觉得在这种情况下这样做很糟糕):(