2015-10-12 20 views
8
char s1[] = "0"; 
char s2[] = "9"; 
printf("%d\n", strcmp(s1, s2)); // Prints -9 
printf("%d\n", strcmp("0", "9")); // Prints -1 

için farklı değerler döndürmek Neden strcmp aynı parametreleri alır farklı değerler döndürür do?strcmp() aynı dize karşılaştırmaları

strcmp man sayfası, strcmp'in dönüş değerinin 0'dan küçük, 0 veya daha büyük olabileceğini söylüyor, ancak bu örnekte neden farklı olduklarını anlamıyorum.

+2

http://ideone.com/S3dYMQ her iki durumda da herkes oynamak istiyorsa ... –

cevap

4

Bu derleme yaparken GCC kullandığınız varsayılmaktadır, ben 4.8.4 üzerinde denedim. Burada hile GCC (bunlardan biri olan strcmp) belirli standart kütüphane fonksiyonlarının semantiğini anlayan olmasıdır. o strcmp belirli bir dizeye sonucu "0" ve "9" negatif olacaktır sabitleri biliyor ve standart uyumlu değer (-1) yerine çağrı yapmanın kullanılacaktır çünkü durumda, derleyici tamamen ikinci strcmp aramayı ortadan kaldıracaktır. s1 ve s2 (bir kesme veya birden konuları, vb hayal) bellekte değişmiş olabilir, çünkü ilk çağrıdan ile aynı yapamaz.

Bu doğrulamak için bir deney yapabilirsiniz. GCC onlar değiştirilemez bildirmek diziler için const eleme ekle: Ayrıca derleyici (-S işaretini kullanın) oluştururlar montajcı çıkışında bakabilirsiniz

const char s1[] = "0"; 
const char s2[] = "9"; 
printf("%d\n", strcmp(s1, s2)); // Now this will print -1 as well 
printf("%d\n", strcmp("0", "9")); // Prints -1 

.

Ancak, en iyi yöntem, bu optimizasyonu devre dışı bırakan -fno-builtin kullanmaktır. Bu seçenek ile, orijinal kod yazdırılır -9

3

Fark, strcmp uygulamasından kaynaklanmaktadır. (< 0, 0,> 0) ile uyumlu olduğu sürece, geliştiricinin önemi yoktur. Başka bir şeye güvenemezsin. Eğer bildiğimiz, kaynak kod negatif olmalıdır belirlemek ve rastgele sizi yanlış yönlendirmek için negatif bir sayı oluşturuyor olabilir.

İlgili konular