upper site current_url php echo ellipsis

php - site - ¿Por qué 1... 1 evalúa a 10.1?



upper codeigniter (4)

Esta pregunta ya tiene una respuesta aquí:

Acabo de enfrentar un pequeño fragmento de PHP de 3v4l: https://3v4l.org/jmrZB

echo 1...1; //10.1

Y me temo que no tengo idea de cómo explicar sus resultados. ¿Por qué se considera esto válido en absoluto?


Diferentes operaciones

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

Ahora, nuestra extraña operación

echo 1...1

se trata como concatenación de no 4 y no 5, lo que resulta en 10.1


El punto ( . ) Tiene dos roles en PHP:

  1. Como dígito decimal, cuando forma parte de un número real, por ejemplo, 1.1 . Tanto la parte integral como la parte decimal son opcionales en números reales pero no al mismo tiempo . Esto significa que 1. y .1 son números reales válidos en PHP pero . No es un número.
  2. Como operador de concatenación de cadenas . Este operador conecta dos subexpresiones de cadena en una expresión más grande. El valor de la expresión más grande es la concatenación de los valores de cadena de las subexpresiones. Las subexpresiones que no son cadenas se convierten en cadenas antes de la concatenación.
    Por ejemplo, 1 . 1 1 . 1 es lo mismo que ''1'' . ''1'' ''1'' . ''1'' y su valor es la cadena ''11'' .

La expresión 1...1 se analiza como 1. . .1 1. . .1 . Según lo dicho anteriormente, 1. y .1 son números reales ( 1.0 y 0.1 ) y el punto medio ( . ) Es el operador de concatenación de cadenas.

Cuando convierte números a cadenas, PHP usa la cantidad mínima de caracteres requerida para esta operación. Si un número real tiene solo una parte integral, entonces representa el número como entero, sin punto decimal y decimales.

Por eso 1. . .1 1. . .1 es lo mismo que ''1'' . ''0.1'' ''1'' . ''0.1'' y el valor final de la expresión es 10.1 .

¿Por qué se analiza 1...1 esta manera?

El analizador lee la expresión de izquierda a derecha. 1 le dice que un número comienza allí. 1. es un número real válido pero 1.. no lo es. Mantiene 1. como un número, entonces el siguiente punto es el operador de concatenación. El siguiente , seguido de un dígito, es el comienzo de otro número real ( .1 ).

Con todo, 1...1 es lo mismo que 1. . .1 1. . .1 .


La aplicación de llaves dejará en claro:

(1.) . (.1)

  • 1. se interpreta como 1
  • . es la concatenación de cadenas
  • .1 se interpreta como 0.1

Todo esto puesto en una cadena es 10.1 como una cadena .

var_dump(1...1) produce string(4) "10.1"


Porque se interpreta como 1. . .1 ( 1 y 0.1 ) por lo tanto obtienes 10.1