Почему echo strcmp('60', '100'); в выводе php 5?

Документация PHP по этой функции немного скудна, и я читал, что эта функция сравнивает значения ASCII, поэтому...

echo strcmp('hello', 'hello');
//outputs 0 as expected - strings are equal.
echo '<hr />';

echo strcmp('Hello', 'hello');
//outputs -32, a negative number is expected as 
//uppercase H has a lower ASCII value than lowercase h.
echo '<hr />';

echo strcmp('60', '100');
//outputs 5.

Последний пример меня смущает. Я не понимаю, почему он выводит положительное число.

  • Значение ASCII 0 = 48
  • Значение ASCII 1 = 49
  • Значение ASCII 6 = 54

  • Общее значение ASCII «60» = (54 + 48) = 102

  • Общее значение ASCII «100» = (49 + 48 + 48) = 145

Функции strcmp() говорят, что «60» «больше», чем «100», хотя кажется, что значение ASCII и длина строки «100» больше, чем «60».

Кто-нибудь может объяснить, почему?

Спасибо


person Rupert    schedule 15.02.2012    source источник


Ответы (3)


strcmp() возвращает разницу первого несовпадающего символа между строками.

6 - 1 is 5.

Когда вы смотрите на него, вы, вероятно, видите не символы или цифры, а только числа.

person wallyk    schedule 15.02.2012
comment
Обратите внимание, что такое поведение не гарантируется — гарантируется только то, что значение этих входных параметров будет больше нуля. - person Simon Richter; 15.02.2012
comment
@SimonRichter: Согласен, это не гарантируется. Но это традиционно. Некоторый код, который я написал в 1978 году и зависит от этого метода вычисления возвращаемого значения, до сих пор работает! - person wallyk; 15.02.2012
comment
@wallyk, откуда вы знаете, что этот ответ правильный, если в документации не сказано, что он возвращает разницу первого символа? - person Pacerier; 30.07.2013
comment
@Pacerier: у меня большой опыт работы с множеством различных библиотек времени выполнения, от PDP-11 под управлением Unix v6 (оригинальный C) до VAX / VMS, MSDOS, Windows, GCOS, Sequent, IBM и микроконтроллеры. Все они реализуют отличие, которое, как указывает некоторый исходный код CRTL, для традиции и идеальной совместимости с оригиналом. - person wallyk; 30.07.2013

Потому что strcmp() останавливается при первом найденном различии. Следовательно, разница между значением ASCII «1» и значением ASCII «6»

person Madara's Ghost    schedule 15.02.2012
comment
@wallyk, откуда вы знаете, что такое поведение гарантировано, если в документации не сказано, что оно возвращает разницу первого символа? - person Pacerier; 30.07.2013

6 на 5 больше, чем 1. Это лексическое сравнение. Первый символ другой, на этом сравнение прекращается.

person deceze♦    schedule 15.02.2012