Почему выражение 011 == 11 оценивается как false?

Когда я занимался php, я заметил, что следующие выражения дают странные результаты:

011 == 11   // false
'011' == 11 // true

Разве они не должны оценивать один и тот же результат?

Ответ 1

Это связано с тем, что 011 рассматривается как восьмеричное значение из-за ведущего 0.

Здесь более подробное объяснение:

  • Литерал 011 распознается как восьмеричное значение
  • Затем преобразуется в десятичное значение, что равно 9
  • Происходит фактическое сравнение, которое выглядит следующим образом: 9 == 11 // false

Как и в случае '011' == 11, он оценивается как true, потому что, когда строка сравнивается с целым числом, она также принудительно приводит к целочисленному значению. Интересно, что начальный ноль в строке игнорируется в процессе, а интерпретатор php обрабатывает значение десятичное, а не восьмеричное!