Почему 1...1 соответствует 10.1? [дубликат]
На этот вопрос уже есть ответ здесь:
Я только что столкнулся с небольшим фрагментом PHP из 3v4l: https://3v4l.org/jmrZB
echo 1...1; //10.1
И, боюсь, я понятия не имею, как объяснить его результаты. Почему это вообще считается действительным?
4 answers
Точка (.
) имеет две роли в PHP:
- Как десятичная цифра, когда она является частью действительного числа, например
1.1
. Как целая часть, так и десятичная часть являются необязательными для действительных чисел , но не в одно и то же время. Это означает, что и1.
, и.1
являются действительными действительными числами в PHP, но.
не является числом. - В качестве оператора конкатенации строк . Этот оператор соединяет два строковых подвыражения в более крупное выражение. Значение большего выражение - это объединение строковых значений вложенных выражений. Вложенные выражения, которые не являются строками, преобразуются в строки перед объединением.
Например,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
.
Потому что это интерпретируется как 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
Рассматривается как объединение № 4 и №5, в результате чего получается 10.1