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
http://ideone.com/S3dYMQ her iki durumda da herkes oynamak istiyorsa ... –