web-dev-qa-db-fra.com

Pourquoi 1 ... 1 est évalué à 10.1?

Je viens de faire face à un petit PHP fragment de 3v4l: https://3v4l.org/jmrZB

echo 1...1; //10.1

Et j'ai bien peur de ne pas savoir comment en expliquer les résultats. Pourquoi est-ce considéré comme valide?

169
Gino Pane

Le point (.) a deux rôles en PHP:

  1. En tant que chiffre décimal, lorsqu'il fait partie d'un nombre réel, par ex. 1.1. La partie intégrale et la partie décimale sont facultatives sur les nombres réels mais pas sur la même heure . Cela signifie que 1. et .1 sont des nombres réels valides dans PHP, mais . n'est pas un nombre.
  2. En tant que opérateur de concaténation de chaînes . Cet opérateur connecte deux sous-expressions de chaîne dans une expression plus grande. La valeur de l'expression la plus grande est la concaténation des valeurs de chaîne des sous-expressions. Les sous-expressions qui ne sont pas des chaînes sont converties en chaînes avant la concaténation.
    Par exemple. 1 . 1 est identique à '1' . '1' et sa valeur est la chaîne '11'.

L'expression 1...1 est analysée comme 1. . .1. Selon ce qui a été dit plus haut, 1. et .1 sont des nombres réels (1.0 et 0.1) et le point central (.) est l'opérateur de concaténation de chaînes.

Lorsque [convertit des nombres en chaînes, PHP utilise le nombre minimal de caractères requis pour cette opération. Si un nombre réel n'a qu'une partie intégrale, il représente le nombre sous forme d'entier, sans point décimal ni décimale.

C'est pourquoi 1. . .1 est identique à '1' . '0.1' et la valeur finale de l'expression est 10.1.

Pourquoi 1...1 est-il analysé de cette façon?

L'analyseur lit l'expression de gauche à droite. 1 lui dit qu'un numéro commence là. 1. est un nombre réel valide, mais 1.. ne l’est pas. Il conserve 1. sous forme de nombre, puis le point suivant est l'opérateur de concaténation. Le prochain ., suivi d'un chiffre, est le début d'un autre nombre réel (.1).

Dans l'ensemble, 1...1 est identique à 1. . .1.

222
axiac

Parce qu'il est interprété comme 1...1 (1 et 0.1), vous obtenez donc 10.1

63
Manfred Radlwimmer

Appliquer des accolades fera comprendre:

(1.) . (.1)

  • 1. est interprété comme 1
  • . est une chaîne concaténation
  • .1 est interprété comme 0.1

Tout cela est mis dans une chaîne est 10.1sous forme de chaîne.

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

45
Polygnome

Différentes opérations.

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

Maintenant, notre étrange opération

echo 1...1 

est traitée comme une concaténation du no 4 et du no 5, ce qui donne 10,1

22
Talha Abrar