为什么1 ... 1评估为10.1?

时间:2017-07-17 08:55:25

标签: php echo ellipsis

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

for

我担心我不知道如何解释其结果。为什么这被认为是有效的?

4 个答案:

答案 0 :(得分:222)

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

  1. 作为十进制数字,当它是实数的一部分时,例如1.1。积分部分和小数部分在实数上是可选的,但不是同时。这意味着1..1都是PHP中的有效实数,但.不是数字。
  2. 作为string concatenation operator。此运算符将两个字符串子表达式连接到一个更大的表达式。较大表达式的值是子表达式的字符串值的串联。在串联之前,非字符串的子表达式将转换为字符串 例如。 1 . 1'1' . '1'相同,其值为字符串'11'
  3. 表达式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 :(得分:63)

因为它被解释为1. . .110.1)因此您得到10.1

答案 2 :(得分:45)

应用大括号会说清楚:

(1.) . (.1)

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

这全部放入一个字符串10.1 作为字符串

var_dump(1...1)收益string(4) "10.1"

答案 3 :(得分:22)

不同的操作。

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 

被视为no 4和no 5的串联,产生10.1