字符串和算术运算的PHP级联(PHP concatenation of strings and ar

2019-09-21 06:56发布

我开始学习PHP不是很久以前,我就遇到了这个问题:

<?php

$a = 1;
$b = 2;

echo "$a * $b  = " . $a * $b;
echo "<br />";

echo "$a / $b  = " . $a / $b;
echo "<br />";

echo "$a + $b  = " . $a + $b;
echo "<br />";

echo "$a - $b  = " . $a - $b;
echo "<br />";

我得到以下的输出:

1 * 2 = 2
1 / 2 = 0.5
3
-1

最后两行输出不是我期望的那样。

为什么是这样? 这些表达式是如何评估的? 我想更好地了解语言的。

Answer 1:

这是发生,因为连接运算符具有更高的优先级比加法或减法运算,但乘法和除法有较高的优先级,然后串联。

所以,你实际上执行的是这样的:

echo ("$a + $b  = " . $a) + $b;
echo ("$a - $b  = " . $a) - $b;

在第一种情况下,被变成了这样:

"1 + 2 = 1" + $b

这PHP试图转换"1 + 2 = 1"成多个(因为类型杂耍 ),并得到如图1所示,转动到表达:

1 + 2

这就是为什么你会得到3同样的逻辑也可以应用到减法的条件。

相反,如果你把括号计算周围,你会得到所需的输出。

echo "$a + $b  = " . ($a + $b);
echo "$a - $b  = " . ($a - $b);


Answer 2:

级联的优先级高于加法和减法,而不是乘除。 所以

echo "$a + $b  = " . $a + $b;

相当于

echo ("$a + $b  = " . $a) + $b;

和PHP忽略第一部分,因为很难将其转换成一个数字,让你只用+ $b

如果你使用括号,你应该罚款。



Answer 3:

嗯,你已经找到真正怪异的行为,但:)

从从算术运算符,除法和乘法具有最高的优先级,所以它们在连接前评估。

虽然添加和提取具有较低的优先级,所以第一左侧部分被评估,然后加入/取出到右部。 但是PHP尝试提取数值出的字符串,只有第一个字符是这样的,所以它与它。



文章来源: PHP concatenation of strings and arithmetic operations