为什么1 … 1评估为10.1?
我刚刚面对3v4l的一小段PHP代码片段: https ://3v4l.org/jmrZB
echo 1...1; //10.1
恐怕我不知道如何解释结果。 为什么这被认为是有效的呢?
点( .
)在PHP中有两个angular色:
- 作为十进制数字,当它是一个实数的一部分,例如
1.1
。 实数部分和小数部分都是可选的, 但不是同一时间 。 这意味着1.
和.1
在PHP中是有效的实数,但是.
不是一个数字。 - 作为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.0
和0.1
),中间点( .
)是string连接运算符。
将数字转换为string时,PHP使用此操作所需的最less字符数。 如果一个实数只有整数部分,那么它代表整数,没有小数点和小数。
这是为什么1. . .1
1. . .1
与'1' . '0.1'
相同'1' . '0.1'
'1' . '0.1'
,expression式的最终值是10.1
。
为什么1...1
parsing?
parsing器从左向右读取expression式。 1
告诉它一个数字从那里开始。 1.
是一个有效的实数,但1..
不是。 它保持1.
作为一个数字,然后下一个点是连接运算符。 下一个.
,后面跟着一个数字,是另一个实数( .1
)的开始。
总而言之, 1...1
与1...1
相同1. . .1
1. . .1
。
因为它被解释为1.
.
.1
( 1
和0.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