2013-11-25 6 views
31

मैं विजुअल स्टूडियो 2010 में सी ++ कर रहा हूं और कुछ अजीब व्यवहार पाया। एक लंबे कहानी कम करने के लिए, मैंने पाया कि इस संकलन नहीं होगा:सी ++ लूप गिनती परिवर्तनीय असंगत व्यवहार का पुनर्विक्रय?

for (int i = 0; i < 10; i++) 
{ 
    int i = 11; 
} 

यह सही लगता है, चर के बाद से मैं पहले से ही पाश हेडर के लिए में घोषित किया जाता है।

अब, हालांकि अगर मैं फिर से घोषणा करने से पहले एक और फॉर-लूप सम्मिलित करता हूं, तो अचानक संकलक, इंटेलिजेंस इत्यादि कोड सही है - कोई असली चेतावनी नहीं दे रहा है (चेतावनी स्तर 3 और चार (/ W3 और/W4))। तो, यह कर वास्तव में संकलन और चलेंगे:

for (int i = 0; i < 10; i++) 
{ 
    for(int j = 0; j < 5; j++) 
    { 
    } 

    int i = 11; 
} 

व्यक्तिगत रूप से, मैं यह अजीब के लिए लूप एक और insering अन्यथा एक ही कोड परिदृश्य legitimates कि पाते हैं। किसी भी तरह की भावना मुझे यह बताने में सक्षम है कि मैं यहां क्या देख रहा हूं?

अग्रिम धन्यवाद!

संपादित करें: वाह, सभी उत्तरों और डेमो के लिए सभी को धन्यवाद - आप कमाल हैं! :) इस नमूने ने एक बग को उजागर किया मेरे दिमाग को पार कर गया, मैंने अभी माना है कि एमएस ने अब तक ऐसी चीज देखी होगी और इसे ठीक कर दिया है ... कम से कम वीएस2013 में।

सुझाए गए अनुकूलन सेटिंग्स को बदलने का प्रयास किया, लेकिन इससे कोई फर्क नहीं पड़ता।

सभी को धन्यवाद!

First piece of code

Second piece of code क़ौम के लिए

क्रेडिट: @Mark गार्सिया

+1

क्या यह संकलक या इंटेलिजेंस है? –

+2

[कोड का पहला भाग] (http://rextester.com/ORRMS33867), [कोड का दूसरा भाग] (http://rextester.com/ESBFG91953)। –

+0

@LuchianGrigore कंपाइलर भी। वीएस2012 पहले स्निपेट को भी खारिज कर देता है और दूसरे को स्वीकार करता है। – Mysticial

उत्तर

19

मानक विनिर्देश के अनुसार:

... नाम घोषित के लिए-init-बयान में उन हालत

हैं के लिए-init-बयान एक घोषणा, नाम (रों) के दायरे में घोषित रूप में एक ही कथात्मक-क्षेत्र में हैं घोषित लिए प्रदान करता है बयान के अंत का अंत। [§6.5.3]

और

नाम हालत के लिए-init-बयान, के लिए दूरी की-घोषणा, और में में घोषित करता है, तो की है, जबकि, के लिए , और स्विच कथन स्थानीय, यदि, के लिए, या कथन कथन (नियंत्रित कथन सहित) के लिए स्थानीय हैं, और उस कथन की बाद की स्थिति में और न ही बाहरीतम ब्लॉक में (या, यदि कथन के लिए, कोई भी पुन: दावा नहीं किया जाएगा) नियंत्रित बयान के बाहरीतम ब्लॉक) [§3.3.3]

एमएसवीसी ++ 2010 का व्यवहार मानक नहीं है और यह एक बग है।

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/12351531/2513200) कुछ हद तक संबंधित प्रश्न (जो आपकी व्याख्या से सहमत है) – Hulk

0

जब आप कुछ पसंद है:

for (int i = 0; i < 10; i++) 
    { 
    //some code 
    } 

आप चर घोषित कर रहे हैं मैं और यह कोड के लिए ब्लॉक करने के लिए गुंजाइश है सीमित कर रहे हैं। तो यह केवल लूप के अंदर दिखाई देगा। इसे ध्यान में रखते हुए, आपका पहला कोड स्निपेट वैरिएबल i को फिर से परिभाषित करता है;

for (int i = 0; i < 10; i++) 
{ 
     int i; 
} 

संकलक एक नई परिभाषा के बारे में शिकायत क्योंकि अब आप एक ही नाम, एक ही डेटा प्रकार और एक ही क्षेत्र के साथ 2 चर है।

जहां तक ​​कोड संकलन का दूसरा टुकड़ा-कॉम्पेलर बग। यह पूरी तरह से संकलक कार्यान्वयन पर निर्भर करता है; यदि आप अनुकूलन स्तर बदलते हैं तो यह अब और दिखाई नहीं दे सकता है।

संबंधित मुद्दे