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


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

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

echo 1...1; //10.1

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

Author: amalloy, 2017-07-17

4 answers

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

  1. Как десятичная цифра, когда она является частью действительного числа, например1.1. Как целая часть, так и десятичная часть являются необязательными для действительных чисел , но не в одно и то же время. Это означает, что и 1., и .1 являются действительными действительными числами в PHP, но . не является числом.
  2. В качестве оператора конкатенации строк . Этот оператор соединяет два строковых подвыражения в более крупное выражение. Значение большего выражение - это объединение строковых значений вложенных выражений. Вложенные выражения, которые не являются строками, преобразуются в строки перед объединением.
    Например, 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.

 221
Author: axiac, 2017-07-19 12:36:56

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

 63
Author: Manfred Radlwimmer, 2017-07-17 08:59:58

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

(1.) . (.1)

  • 1. интерпретируется как 1
  • . является строковой конкатенацией
  • .1 интерпретируется как 0.1

Все это, помещенное в строку, является 10.1 как струна.

var_dump(1...1) урожайностьstring(4) "10.1"

 45
Author: Polygnome, 2017-07-17 09:07:13

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

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

 22
Author: Talha Abrar, 2017-07-17 09:23:25