return *(const unsigned char*)s1-*(const unsigned char*)s2;
OP: w skrócie, co dzieje się w ostatniej linii?
A: Porównywana jest pierwsza potencjalna różnica między łańcuchami. Zarówno chars
są określane jako unsigned char
zgodnie z wymaganiami specyfikacji. Te 2 są promowane na int
, a różnica jest zwracana.
Uwagi:
1 znak wartości zwracanej za (< 0, 0> 0) jest najbardziej znaczącym elementem. Jest to jedyna część określona przez specyfikację C.
2 W niektórych systemach char
jest signed
(bardziej powszechne). Na innych numer char
to unsigned
. Określenie "znaku" ostatniego porównania promuje przenośność. Zauważ, że fgetc()
uzyskuje znaki jako unsigned char
.
3 Poza tym, że ciąg kończy się na \0
, kodowanie użytych znaków (podobnie jak w ASCII - najczęściej), nie robi różnicy na poziomie binarnym. Jeśli pierwsze char
s, które różnią się 2 ciągami mają wartości 65 i 97, pierwszy ciąg będzie mniejszy niż drugi, nawet jeśli kodowanie znaków nie jest ASCII.OTOH, strcmp("A", "a")
zwróci liczbę ujemną, gdy kodowanie znaków ASCII, ale może wrócić liczbę dodatnią w innym kodowaniu znaków do ich wartości bazowych i porządku nie są zdefiniowane przez C.
Nie ma nic „zoptymalizowany” o tej implementacji. –