【问题标题】:Why does 1...1 evaluate to 10.1? [duplicate]为什么 1...1 评估为 10.1? [复制]
【发布时间】:2017-12-21 17:30:13
【问题描述】:

我刚刚遇到了来自 3v4l 的一点 PHP sn-p:https://3v4l.org/jmrZB

echo 1...1; //10.1

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

【问题讨论】:

  • 注意:SO 语法高亮显示第一个点为红色,而其他点为黑色。我认为这是一个很好的提示。如果最后一个点也是红色就好了,但总比没有好。
  • 棘手的连接问题...

标签: php echo ellipsis


【解决方案1】:

点 (.) 在 PHP 中有两个作用:

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

表达式1...1 被解析为1. . .1。根据上面所说,1. 和 .1 是实数(1.0 和 0.1),中间的点(.)是字符串连接运算符。

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

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

为什么1...1会这样解析?

解析器从左到右读取表达式。 1 告诉它一个数字从那里开始。 1. 是一个有效的实数,但 1.. 不是。它将1. 保留为数字,然后下一个点是连接运算符。下一个.,后面跟着一个数字,是另一个实数(.1)的开始。

总而言之,1...1 与 1. . .1 相同。

【讨论】:

  • 我刚试过echo 1/.1,结果是10。为什么即使只有一个.,它仍然会连接两个整数?
  • @Swellar 1/.1 是 divide 1 by 0.1 即 10。
  • 1/.1 是一个数字。它是1 除以0.1。表达式1/.1 的值为10。不涉及字符串。
  • 假设这个答案是正确的,为什么1..1和1..1.都不打印“11”?
  • 解析器是贪婪的。在片段仍然生成有效令牌时,它会尽可能多地读取。这就是为什么 1. 是一个浮点数而不是整数 1 后跟连接运算符 (.)。出于同样的原因,1..1 是 1. 后跟 .1 和 1..1. 是 1. 后跟 .1 后跟 .。
【解决方案2】:

不同的操作。

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

【讨论】:

    【解决方案3】:

    使用大括号会清楚:

    (1.) . (.1)

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

    这一切放入一个字符串是10.1作为一个字符串。

    var_dump(1...1)yieldstring(4) "10.1"

    【讨论】:

    • 只有当你已经知道在哪里应用大括号时,才能清楚地应用大括号。
    • @pipe 这就是为什么我展示了如何应用它们。
    【解决方案4】:

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

    【讨论】:

    • 呃,我还以为...是 splat 操作员,干得好
    • .是一个连接操作而不是一个加号。
    • 似乎有道理,但 PHP 通常不会使用点连接数字,但这里出于某种原因它会这样做。
    • php 照你说的做。在这里你告诉它concatenate 项目。由于项目不是字符串 - php 将它们转换为字符串。
    • 没有“连接数字”这样的东西。字符串是连接的;数字在连接之前首先转换为字符串。
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2012-03-06
    • 2021-11-01
    相关资源
    最近更新 更多