【问题标题】:Why is the answer 15 here?为什么这里的答案是 15?
【发布时间】:2013-05-26 21:48:26
【问题描述】:

对于下面的代码 sn-p 答案是 15。

$a = '5 USD';
$b = 10;
echo $a + $b;

但在变量$a 中,如果5 介于'USD' 之间或'USD' 之后,则输出为10。为什么会这样?

【问题讨论】:

  • 它被称为“松散打字”和“打字杂耍”php.net/manual/en/language.types.type-juggling.php
  • 你能解释一下@Mark Ba​​rker
  • 我链接的页面几乎说明了一切......您将加法运算符与另一个(整数)值(10)一起使用,因此 PHP 尝试通过将字符串转换为整数值来进行加法可以添加到 10
  • 是的。谢谢@MarkBaker
  • PHP 没有定义变量类型。因此,当您进行加法运算时,它会尝试转换为数字格式。只有当字符串以数字开头并且一旦找到非数字字符时,它才会将字符串转换为数字,它就会停止,因此 $a 变为 5。

标签: php string numbers


【解决方案1】:

来自php.net

当在数字上下文中计算字符串时,结果值 和类型确定如下。

如果字符串不包含任何字符“.”、“e”或“E” 并且数值适合整数类型限制(定义为 PHP_INT_MAX),字符串将被评估为整数。在所有其他 情况下,它将被评估为浮点数。

该值由字符串的初始部分给出。如果字符串 以有效的数字数据开头,这将是使用的值。 否则,该值将为 0(零)。有效的数字数据是 可选符号,后跟一个或多个数字(可选包含一个 小数点),后跟一个可选的指数。指数是一个 'e' 或 'E' 后跟一个或多个数字。

字面意思:

  1. $a + $b 表示numeric + numeric
  2. "5 USD" 以有效的数字数据开头,因此 PHP 将其转换为 5
  3. "USD 5""U5SD" 有效的数字数据开始,因此 PHP 将其转换为 0

UPDv1:

<?php
header('Content-Type: text/plain');

function plus($a, $b){
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
}

plus('5 frogs', 3);   // 5 + 3 = 8
plus('frogs: 5', 3);  // 0 + 3 = 3
plus('f5rogs', 3);    // 0 (not HEX)  + 3 = 3
plus('0xF5', 3);      // 245 (HEX)    + 3 = 248
plus('0011b', 3);     // 11 (not BIN) + 3 = 14
plus('1E5', '1.2xx'); // 100000 (FLOAT) + 1.2 (FLOAT) = 100001.2
plus('true', 2);      // 0 (not BOOL)   + 2 = 2
?>

另外,看看这个:php string number concatenation messed up


UPDv2:

无论填零效果如何,PHP 都“无法”将字符串值类型转换为八进制。尽管如此,如前所述,PHP 能够将字符串类型转换为十六进制。

<?php
header('Content-Type: text/plain');

function plus($a, $b){
    echo $a, ' + ', $b, ' = ', $a + $b, PHP_EOL;
}

plus(008, 12);     // Invalid octal, PHP assumes it is 0. Result: 12.
plus('008', 12);   // Invalid octal? No, it is decimal. Result: 20.
plus(0x0F, 1);     // Valid hexadecimal. Result: 16.
plus('0x0F', 1);   // Valid hexadecimal. Result: 16.
plus('0x0X', 1);   // Invalid hexadecimal, PHP assumes it is 0. Result: 1.
?>

字符串到数字的转换”文档中没有提到。

【讨论】:

    【解决方案2】:

    因为

    php > echo (int)"a";
    0
    

    因此,如果您将 PHP 可执行文件提供给

    php > "USD 5" + "10"
    

    它将两个操作数转换为整数:

    php > (int)"USD 5" + (int)"10"
    

    因此您将收到0 + 10的结果。

    【讨论】:

      【解决方案3】:

      PHP Manual Language.types.string.conversion

      字符串转换为数字

      在数值上下文中计算字符串时,结果值和类型确定如下。

      如果字符串不包含任何字符 '.'、'e' 或 'E' 并且数值符合整数类型限制(由 PHP_INT_MAX 定义),则字符串将被评估为整数。在所有其他情况下,它将被评估为浮点数。

      该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,这将是使用的值。否则,该值将为 0(零)。有效的数字数据是一个可选的符号,后跟一个或多个数字(可选地包含一个小数点),后跟一个可选的指数。指数是“e”或“E”后跟一位或多位数字。

      示例可以在手册中找到(上面的链接)

      $foo = 1 + "bob-1.3e3";           // $foo is integer (1)
      $foo = 1 + "bob3";                // $foo is integer (1)
      $foo = 1 + "10 Small Pigs";       // $foo is integer (11)
      

      回答你的问题

      $a = '5 USD'; // The string starts with number, so by an implicit cast to int, it will be 5
      $b = 10;
      echo $a + $b; // = 15
      

      在你写的另一个例子中

      $a = 'USD 5'; // The string does not start with a number, so by an implicit cast to int, it will be 0
      $b = 10;
      echo $a + $b; // = 10
      

      有关此转换的详细信息,请参阅Unix manual page for strtod(3)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 2013-09-02
        • 2020-02-15
        • 2010-09-07
        • 2017-07-07
        • 1970-01-01
        相关资源
        最近更新 更多