字符串连接中没有括号的算术运算会导致奇怪的结果

时间:2011-09-27 19:28:01

标签: php concatenation arithmetic-expressions

考虑以下代码行:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.$x-$y;
?>

输出为3,这是计算$ x- $ y的预期结果。但是,预期的输出是:

  

10 - 7 = 3

因此,我的问题是,我在计算中连接的字符串发生了什么变化?我知道为了产生我期望的结果,我需要将算术运算括在括号中:

<?php
$x = 10;
$y = 7;

echo '10 - 7 = '.($x-$y);
?>

输出

  

10 - 7 = 3

但是由于PHP没有抱怨原始代码,我想知道在这种情况下产生的输出背后的逻辑是什么?字符串在哪里?如果有人可以解释它或指向我在PHP手册中解释的位置,我将不胜感激。

3 个答案:

答案 0 :(得分:4)

您的字符串'10 - 7 = '正在与$x连接。然后将其解释为int,结果为10,然后减去7,结果为3

有关详细说明,请尝试以下操作:

echo (int) ('10 - 7 = ' . 10); // Prints "10"

有关字符串到数字转换的详细信息,请参阅http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion

  

如果字符串以有效数字数据开头,则这将是使用的值

答案 1 :(得分:4)

在此代码中:

echo '10 - 7 = '.$x-$y;

串联优先,所以你留下的是:

echo '10 - 7 = 10'-$y;

因为这是尝试用字符串执行整数减法,所以首先将字符串转换为整数,所以你留下这样的东西:

echo (int)'10 - 7 = 10'-$y;

该字符串的整数值为10,因此生成的算术如下所示:

echo 10-$y;

由于$y710 - 7 = 3,因此回显的结果为3

答案 2 :(得分:2)

.-具有相同的precedence,因此PHP将'10 - 7 = 10'重新解释为数字,给出10,减去7给出3 }}