PHP串联字符串和算术运算

时间:2012-08-16 18:27:26

标签: php programming-languages weak-typing

我不久前开始学习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

输出中的最后两行不是我所期望的。

这是为什么?这些表达式是如何评估的?我正在努力更好地理解这门语言。

3 个答案:

答案 0 :(得分:8)

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

所以,你真正执行的是:

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

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

"1 + 2 = 1" + $b

哪个PHP尝试将"1 + 2 = 1"转换为数字(因为type juggling)并获得1,将表达式转换为:

1 + 2

这就是你得到3的原因。相同的逻辑可以应用于减法条件。

相反,如果在计算周围加上括号,您将得到所需的输出。

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

答案 1 :(得分:1)

连接优先于加法和减法,但不优先于乘法或除法。所以

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

相当于

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

PHP忽略了第一部分,因为很难将其转换为数字,只留下+ $b

如果你使用括号,你应该没事。

答案 2 :(得分:0)

嗯,你发现了非常奇怪的行为,但是:)

从算术运算符中,除法和乘法具有最高优先级,因此在连接之前对它们进行求值。

虽然添加和提取的优先级较低,但首先评估左侧部分,然后将其添加/提取到右侧部分。但PHP试图从字符串中提取数值,只有第一个字符是这样的,所以用它来做。