Почему 1 ... 1 оценивается в 10.1? [дубликат]


этот вопрос уже есть ответ здесь:

Я только что столкнулся с небольшим фрагментом PHP из 3v4l:https://3v4l.org/jmrZB

echo 1...1; //10.1

и я боюсь, что я не знаю, как объяснить его результаты. Почему это считается действительным на все?

4 168

4 ответа:

точка (.) имеет две роли в PHP:

  1. как десятичная цифра, когда она является частью реального числа, например 1.1. Как целая часть, так и десятичная часть являются необязательными для действительных чисел но не в одно и то же время. Это означает, что оба 1. и .1 действительны действительные числа в PHP, но . - Это не число.
  2. как оператор конкатенации строк. Этот оператор соединяет два строковых подвыражения в a более широкое выражение лица. Значение большего выражения является конкатенацией строковых значений вложенных выражений. Вложенные выражения, которые не являются строками, преобразуются в строки перед конкатенацией.
    Е. Г. 1 . 1 это то же самое, что '1' . '1' и его значение-строка '11'.

выражение 1...1 анализируется как 1. . .1. Согласно сказанному выше,1. и .1 - это реальные цифры (1.0 и 0.1) и средняя точка (.) is оператор конкатенации строк.

при преобразовании чисел в строки PHP использует минимальное количество символов, необходимое для этой операции. Если действительное число имеет только интегральную часть, то оно представляет число как целое, без десятичной точки и десятичных знаков.

вот почему 1. . .1 это то же самое, что '1' . '0.1' и конечное значение выражения 10.1.

почему 1...1 проанализированный таким образом?

парсер читает выражение слева направо. 1 говорит, что там начинается число. 1. является допустимым вещественным числом, но 1.. нет. Он держит 1. как число, то следующая точка-это оператор конкатенации. Следующий ., за которым следует цифра, является началом другого действительного числа (.1).

все 1...1 это то же самое, что 1. . .1.

потому что это интерпретируется как 1...1 (1 и 0.1) поэтому вы получаете 10.1

применение фигурных скобок даст понять:

(1.) . (.1)

  • 1. трактуется как 1
  • . - строка объединение
  • .1 трактуется как 0.1

это все положить в строку 10.1в строке.

var_dump(1...1) доходностьstring(4) "10.1"

Различные Операции.

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 

рассматривается как конкатенация no 4 и no 5, что приводит к 10.1