168 votes

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

Je viens de faire face à un petit extrait de code PHP 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?

221voto

axiac Points 13906

La dot (.) a deux rôles en PHP:

  1. Comme les chiffres, quand il fait partie d'un nombre réel, par exemple, 1.1. À la fois la partie entière et la partie décimale sont en option sur les nombres réels , mais pas sur le même temps. Cela signifie à la fois 1. et .1 sont valables nombres réels en PHP, mais . n'est pas un nombre.
  2. Comme l' opérateur de concaténation de chaîne. Cet opérateur se connecte chaîne de deux sous-expressions dans une plus grande expression. La valeur de l'expression plus grande est la concaténation de la chaîne de valeurs de la sous-expressions. Les sous-expressions qui ne sont pas des chaînes sont converties en chaînes avant de concaténation.
    E. g. 1 . 1 est le même que '1' . '1' , et sa valeur est la chaîne de caractères '11'.

L'expression 1...1 est analysée comme 1. . .1. Selon ces dit ci-dessus, 1. et .1 sont des nombres réels (1.0 et 0.1) et le point du milieu (.) est l'opérateur de concaténation de chaîne.

Lorsque convertit les nombres en chaînes, PHP utilise le montant minimum de caractères requis pour cette opération. Si un nombre réel a seulement partie intégrante de la partie alors qu'il représente le nombre entier, sans virgule et sans décimales.

C'est pourquoi, 1. . .1 est le même que '1' . '0.1' et la valeur finale de l'expression est - 10.1.

Pourquoi est - 1...1 interprétés de cette manière?

L'analyseur lit l'expression de gauche à droite. 1 le raconte un nombre commence là. 1. est valable un nombre réel, mais 1.. ne l'est pas. Il conserve 1. comme un numéro, puis de la suivante, dot est l'opérateur de concaténation. Le prochain ., suivi par un chiffre, c'est le début d'un autre nombre réel (.1).

Dans l'ensemble, 1...1 est le même que 1. . .1.

63voto

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

45voto

Polygnome Points 4766

Appliquer des accolades fera comprendre:

(1.) . (.1)

  • 1. est interprété comme 1
  • . est la concaténation de chaînes
  • .1 est interprété comme 0.1

Tout cela dans une chaîne est 10.1 tant que chaîne .

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

22voto

Talha Abrar Points 791

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X