2012-02-15 20 views
12

PHP na tej funkcji jest nieco rzadki i czytałem, że ta funkcja porównuje wartości ASCII tak ...Dlaczego "echo strcmp ('60 ',' 100 ');" w wyjściu php 5? Dokumentacja

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. 

Ostatnim przykładem jest mylące mnie. Nie rozumiem, dlaczego generuje liczbę dodatnią.

  • ASCII Wartość 0 = 48
  • ASCII Wartość 1 = 49
  • ASCII wartości 6 = 54

  • Całkowita wartość ASCII '60' = (54 + 48) = 102

  • wartość ASCII '100' = (49 + 48 + 48) = 145

The strcmp() to e funkcje aying że „60” jest „większy” niż „100”, chociaż wydaje się, że wartość ASCII i długość ciąg „100” jest większa niż „60”

Może ktoś wyjaśnić, dlaczego?

Dzięki

Odpowiedz

13

strcmp() zwraca różnicę pierwszej nie pasującego znaku między strunami.

6 - 1 to 5.

Kiedy patrzysz na niego, prawdopodobnie nie widząc znaki lub cyfry — tylko numery

+6

Należy zauważyć, że nie jest to zachowanie gwarantowane - gwarantowane jest tylko, że dla tych parametrów wejściowych wartość będzie większa niż zero. –

+2

@SimonRichter: Uzgodnione, że nie jest gwarantowane. Ale to * jest * tradycyjne. Jakiś kod napisałem w 1978 roku, który zależy od tej metody obliczania wartości zwracanej * nadal działa *! – wallyk

+0

@ Wallyk, skąd wiesz, że ta odpowiedź jest poprawna, gdy dokumentacja nie mówi, że zwraca różnicę pierwszego znaku? – Pacerier

8

Ponieważ strcmp() zatrzymuje się na pierwszej różnicy znajdzie. Stąd różnica między wartością ASCII "1" i wartością ASCII "6"

+0

@wallyk, skąd wiadomo, że to zachowanie jest gwarantowane, gdy dokumentacja nie mówi, że zwraca różnicę w pierwszym znaku? – Pacerier

5

6 jest 5 "większa" niż 1. Jest to porównanie leksykalne. Pierwszy znak jest inny, to tam kończy się porównanie.