C, bir değişkeni kendi değerine sıfırlamak anlam ifade eder mi? Evet ise, ne için?Bir değişkeni kendi tanımsız değerine sıfırlayın
Detay vermeme izin verin. Git kaynaklarında, transport.c veya wt-status.c'da görüldüğü gibi, bir değişkeni kendi tanımsız değerine sıfırlamak için bazı örnekler vardır. Bu bildirimlerden ödevleri kaldırdım ve testleri çalıştırdım. Hiçbir regresyon görmedim, bu ödevlerin gereksiz olduğunu düşündüm.
Öte yandan, ben GCC 4.6 ve Clang 2.9 ile bazı basit testler yaptık.-Wall -std=c99
ve çeşitli
-O
seviyeleri ile derleniyor
#include <stdio.h>
int main() {
printf("print to increase probability of registers being non-zero\n");
int status = status;
return printf("%i\n", status);
}
hiçbir uyarı yazdırır ve status == 0
olduğunu göstermektedir. Sıfır olmayan bir optimizasyon seviyesiyle Clang, bazı çöp değerlerini yazdırır. Bu tür ifadelerin sonuçlarının tanımlanamayacağını anlamamı sağlıyor.
Böyle bir atamanın bir başlatılmamış değişken uyarısını engelleyebileceğini hayal edebiliyorum, ancak Git'ten alınan örnekler için geçerli değildir. Ödevleri kaldırmak herhangi bir uyarı getirmez.
Böyle atamalar tanımsız bir davranış mıdır? Eğer değilse, bunları ne için kullanıyorsunuz?
Git posta listesinde değişiklik önerdim. Here's what I've learned.
Belki, gitmedeki örnekler * * sisteminiz için başlatılmamış bir değişken uyarısını, diğer geliştiricilerin düzenli olarak kullandığı sistemlerde bir uyarıyı bastırmaz. GCC ile, başlatılmamış değişken uyarıları optimizasyon bayraklarından etkilenir ve Clang, GCC için “bir ikame değiştirme” olmasına rağmen oldukça farklı uyarılar üretir. –
Bu tür değişkenleri ilklendirmeyi tamamen bırakmak yerine 0 (veya -1) olarak başlatabilirim. Birisi kodu bir amaç için ekledi; Tuhaf kullanılan mekanizmayı bulsam da amacına saygı gösterebilirim. –
@JonathanLeffler, sadece tuhaf değil, tuzak temsilcilikleri olan platformlarda bu tanımlanmamış bir davranış sağlar. –