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

Gin*_*ane 168 php ellipsis echo

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

echo 1...1; //10.1
Run Code Online (Sandbox Code Playgroud)

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

axi*_*iac 221

dot(.)在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...1是一样的1. . .1.

  • @Swellar`1/.1`是`将1除以0.1`,即10. (68认同)
  • 解析器很贪心.当片段仍然生成有效令牌时,它尽可能多地读取.这就是为什么`1.`是一个浮点数而不是整数`1`后面跟着连接运算符(`.`).出于同样的原因,`1..1`是`1.`后跟`.1`和`1..1.是`1.`后跟`.1`后跟`.`. (7认同)
  • `1/.1`是一个数字.它是"1"除以"0.1".表达式"1/.1"的值是"10".没有涉及字符串. (6认同)
  • 假设这个答案是正确的,为什么"1..1"和"1..1.打印"********? (3认同)
  • 我刚试过`echo 1/.1`,结果是'10`.为什么它仍然连接两个整数,即使只有一个`.`? (2认同)

Man*_*mer 63

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

  • 没有*"连接数字"*这样的东西.字符串连接在一起; 在连接之前,数字首先转换为字符串. (12认同)
  • 的.是串联操作而不是加号. (7认同)

Pol*_*ome 45

应用括号将清楚说明:

(1.) . (.1)

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

这全部放入一个字符串是10.1 一个字符串.

var_dump(1...1) 产量string(4) "10.1"

  • 如果你已经知道应用它们的位置,那么应用括号是很明确的. (4认同)
  • @pipe这就是为什么我展示*如何*应用它们. (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
Run Code Online (Sandbox Code Playgroud)

现在,我们奇怪的操作

echo 1...1 
Run Code Online (Sandbox Code Playgroud)

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