为什么1 … 1评估为10.1?

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

echo 1...1; //10.1 

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

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

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

expression式1...1被parsing为1. . .1 1. . .1 。 根据上面所述, 1..1是实数( 1.00.1 ),中间点( . )是string连接运算符。

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

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

为什么1...1parsing?

parsing器从左向右读取expression式。 1告诉它一个数字从那里开始。 1.是一个有效的实数,但1..不是。 它保持1.作为一个数字,然后下一个点是连接运算符。 下一个. ,后面跟着一个数字,是另一个实数( .1 )的开始。

总而言之, 1...11...1相同1. . .1 1. . .1

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

应用大括号将会说清楚:

(1.) . (.1)

  • 1.被解释为1
  • . 是string连接
  • .1被解释为0.1

这一切都放在一个string是10.1 作为一个string

var_dump(1...1)产生string(4) "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 

被视为no 4和no 5的级联,导致10.1