字符串和算术运算的 PHP 串联


PHP concatenation of strings and arithmetic operations

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

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

这是为什么呢?如何计算这些表达式?我试图更好地理解这门语言。

发生这种情况是因为串联运算符的优先级高于加法或减法运算符,但乘法和除法的优先级高于串联运算符。

所以,你真正要执行的是这样的:

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);

串联优先于加法和减法,但不能乘法或除法。所以

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

相当于

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

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

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

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

从算术运算符来看,除法和乘法具有最高的优先级,因此它们在串联之前进行评估。

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