2011-03-10 11 views
10

C++ kodu Visual C++ 9 ile "uyarı düzeyi 4" ile derlediğimde:"While (true)" için bir derleyici uyarısı verme ve "for (;;)" için bir tane vermeme noktası nedir?

while(true) { 
    //loop body with break on certain condition 
} 

ve aşağıdakiler:

for(; true;) { 
    //same loop body 
} 

her ikisi de C4127: conditional expression is constant uyarısını tetikler ancak

for(; ;) { 
    //same loop body 
} 

, uyarı vermeden derler.

Neden bu fark, özellikle ikinci ve üçüncü varyant arasında?

+1

üncü ifadede herhangi bir koşullu ifade olmadığından ... ikinci ve üçüncü sırada bulunurken .... derleyici, koşullu ifade konusunda herhangi bir uyarı olmadan nasıl uyarı üretebilir? –

+1

Genellikle, özellikle destek kullanırken C4127'yi #pragma warning ile devre dışı bırakıyorum. –

+0

İlgili: http://stackoverflow.com/questions/224421/constant-value-in-conditional-expression – CesarB

cevap

6

Bunun sebebi aptal olsa da basittir.

O sonsuz döngü teşhis etmek önemlidir ama böyle belirgin olmayabilir:

while(i >= 0) { --i; } // infinite if i unsigned 

while(SOME_MACRO(i)) // err, depends on the expansion of macros 

bir totolojik test için bir uyarı üretmek için bir derleyici büyük bir özelliktir, çıkıyor bir testtir Ya her zaman doğru ya da her zaman yanlış olmak, çünkü bir makro genişlemeden veya bağımlı bir bağlamdan geldiğinde açık değildir.

Sadece VC + + 'nın buraya çok fazla ittiğini görüyoruz ve tatolojik koşulları göz önünde bulundurmak yerine, kodda zaten açık bir şekilde belirtilmiş olsa bile, tüm true veya false koşullarını uyarır.

4
yapısı, kasıtlı olarak kasten "sonsuz" bir döngüye kodlamadır. Derleyici tasarımcılarının bunun için bir uyarı üretmek istemediklerini hayal edebiliyorum.
+6

Diğer bir nedenden dolayı nedensizlik olduğunu söyleyebilirim - bu kanonik * çünkü * belirli bir uyarı vermiyor popüler derleyici dizisi. –

+0

VS dışında bir derleyici içeriyorsanız, onun bile kanonik olduğunu sanmıyorum. Bence gcc bu konuda uyardı mı? –

+0

@jk: Aslında haklısın, GCC bu yapılardan ikisini de uyarmıyor. Bunu test etmedim, sadece spekülasyon yaptım. – DevSolar

10

Kullanıcının sürekli koşullu ifadeleri uyarma nedeninin, ifadenin sabit kaldığı (örneğin yazım hatası nedeniyle) hataların önlenmesine yardımcı olmaktır. Son durumda, hiçbir ifade yoktur, dolayısıyla yanlışlıkla sabit olma riski yoktur.

4

Nokta yok. Sonuçta, dildeki özellikleri ($ 6.5.3/2),

biri ya da durum ve ekspresyon hem de ihmal edilebilir söyledi. A eksik durumu, öğesini, (true) iken eşdeğerine eşdeğer kılarken sağlar.

Yani for (; ;) bile Standardına göre while(true) eşdeğerdir. Bu nedenle, derleyicinin bir durumda neden uyarı vermesi gerektiğine dair bir neden göremiyorum ama diğerinde değil!

-

derleyici uyarı vermek karar verirse durum uyarısı olarak yorumlanır böylece, mevcut olduğunda aksine eksik olduğunda, o zaman bence, derleyici uyarı vermelidir , programcı için nolu nolu açık bir şekilde ve açıkça'dan bahsetmek için ipucu.

Yani for (;;)for (;true;) içinde durumun açık söz daha bir yazım hatası olması daha muhtemeldir olduğunu. İkincisi, programcının açık ve net niyetini söyler. Steve yorumunda söylediği gibi:

bir int değeri y için

, karakter x = y x = (char) y yakmak için eşdeğerdir ancak sen bir örtülü daralması dönüşüm için bir uyarı isteyebilirsiniz ilk ancak ikinci değil.

Bu nedenle, dolaylı niyetin alınması gerekirken açık niyet uyarı almamalıdır!

+0

@Downvoter: Neden düşüş yok? – Nawaz

+2

Düşündüğüm zaman değil, ama denklik kırmızı bir ringa olduğunu düşünüyorum. Başka bir örnek için, eğer '(x = y)' ifadesi '(x (y))' değerine eşdeğerdir, fakat GCC, ikincisini değil, ikincisini uyarır. Int değeri y için, 'char x = y', char x = (char) y 'öğesine eşdeğerdir, ancak ilkinde değil, ikincide örtük bir daraltma dönüşümü için uyarı isteyebilirsiniz. –

+2

doğru ama inandırıcı olmak için (gerçek) bir yazım hatası olması muhtemeldir. imho VS aşırı telaşlı burada –

1

Derleyici uyarısı, olası hataları yakalamaya yardımcı olmak için buradadır. while döngüsünde her zaman true koşulunun kullanılması büyük olasılıkla bir hatadır. Exemple için aşağıdaki kodda, bu muhtemelen bir hata olduğunu ve derleyici bana bu konuda uyarmak istiyorum: Böyle bir durumda

unsigned int x; 
// ... 
while (x >= 0) { 
    // ... 
} 

, optimize edilmiş yapı içinde derleyici koşulu olduğunu anlamak muhtemelen olacaktır her zaman doğrudur (işaretsiz bir tamsayı 0'dan küçük olamaz). Dolayısıyla, while döngüsünde her zaman true koşulunun algılanmasına ihtiyaç vardır. Bence böyle bir hatanın tespitini yazan kişi, while (true) numaralı vakanın özel bir örneğini vermedi, çünkü for (;;) ile sonsuz bir döngü yapmak için basit bir yol var. Sen karar Visual Studio bir uyarı ya da değil nasıl ekleneceğini here, okuyabilir

, (exemple yaklaşık C# ama ben takım C++ uyarı için başparmak aynı kuralı olduğunu varsayalım) alınır.