为什么1... 1等于10.1?

我刚刚面对了来自3v4l: https://3v4l.org/jmrZB的一小段 PHP 代码

echo 1...1; //10.1

恐怕我不知道该如何解释它的结果。为什么这被认为是有效的呢?

10348 次浏览

因为它被解释为 1. . .1(10.1) ,所以你得到 10.1

点(.)在 PHP 中有两个角色:

  1. 作为十进制数字,当它是实数的一部分时,例如 1.1。在实数 但不是在同一时间上,整数部分和小数部分都是可选的。这意味着 1..1在 PHP 中都是有效的实数,但是 .不是数字。
  2. 作为 字符串串联运算符。此运算符将两个字符串子表达式连接到一个较大的表达式中。较大表达式的值是子表达式的字符串值的串联。非字符串的子表达式在串联之前被转换为字符串。
    例如,1 . 1'1' . '1'相同,它的值是字符串 '11'

表达式 1...1解析为 1. . .1。根据以上所述,1..1是实数(1.00.1) ,中间点(.)是字符串串联运算符。

当将数字转换为字符串时,PHP 使用此操作所需的最小字符量。如果一个实数只有整数部分,那么它表示为整数,没有小数点和小数。

这就是为什么 1. . .1'1' . '0.1'相同,表达式的最终值是 10.1

为什么用这种方式解析 1...1

解析器从左向右读取表达式。1告诉它一个数字从这里开始。1.是一个有效的实数,而 1..不是。它保持 1.作为一个数字,然后下一个点是连接运算符。下一个 .后跟一个数字,是另一个实数(.1)的开头。

总之,1...11. . .1是一样的。

使用大括号可以清楚地表明:

(1.) . (.1)

  • 1.被解释为 1
  • .是字符串 连接
  • .1被解释为 0.1

这一切都放入一个字符串是 10.1 就像一根绳子

收益率

不同的行动。

1. <?php echo 1.1; ?> // gives simple 1.1
2. <?php echo 1...1; ?> // gives 10.1
3. <?php echo 1..'1'; ?> // gives 11
4. <?php var_dump(1.); ?> // gives 1
5. <?php var_dump(.1); ?> // gives 0.1

现在,我们奇怪的行动

echo 1...1

被视为4号和5号的串联,结果是10.1