PHP操作符优先级与字符串连接?

5
请看下面的代码片段。
$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个回答

3
当变量没有参与任何算术运算时(比如你的第一个$i),PHP 将不会创建临时变量。因此,当执行$i++ 后,在语句结束后才会计算第一个 $i
为了避免这种情况,你仍然可以这样写:
echo ($i += 0).($i++);

但这显然不是一个好的编程实践。
编辑:当你使用“,”时,它实际上是缩短了两个PHP语句。它严格等同于:
echo $i;
echo $i++;

由于递增运算是在最后一个语句执行之后进行的,因此 11 确实是结果。


2

第一个例子

方括号中的代码首先被评估 - 在这种情况下是 ($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


你说括号里的代码先执行。那么 echo ($i = ($i++)); 将会是2而不是1。或者我有什么地方理解错了吗? - Red
在那段代码中,你取得了 $i 的值,并将其递增,然后再将旧的值赋回去 - 这就是为什么输出的是原始值。 - George Brighton
看起来我有麻烦了。我的想法是这样的,当检查代码时,内部括号 ($i++) 需要计算为 2(1+1),然后将该值分配给本地变量 $i,最后将结果输出为 2。请还要查看我的更新问题 :( - Red
1
$i++ 不等同于 $i + 1$i++ 的值是 $i,但是 $i 的值会在之后递增。也许你想要的是 ++$i - George Brighton
谢谢解释。我的大脑被劫持了 :) - Red

1
根据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


这个真的帮助我理解了,但是我已经接受了一个答案(我感觉在这种情况下SO不太好)。 - Red

0
首先,对于第二个位置,它使用$i eq 1; 然后将其增加到2; 因此,对于第一个位置,它使用2,对于第二个位置,它使用1。

如果没有括号会怎样? - Red
@Red 结果将会是相同的。 - falinsky
@Red 我知道,但现在还没有答案。 - falinsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接