2011-12-16 10 views
6

जब मैं सी ++ मानक पढ़ रहा हूं, ऐसा लगता है कि निम्न कोड मानक के अनुसार बिल्कुल ठीक है।स्केलर प्रकार w/o प्रारंभकर्ता के ऑब्जेक्ट के दायरे में कूदना ठीक क्यों है?

int main() { 
    goto lol; 
    { 
     int x; 
lol: 
     cout << x << endl; 
    } 
} 

// OK 

[n3290: 6.7/3]: यह एक ब्लॉक में स्थानांतरित करना संभव है, लेकिन एक तरह से है कि आरंभीकरण साथ घोषणाओं नजरअंदाज में नहीं। एक प्रोग्राम है जो एक बिंदु से कूदता है जहां स्वचालित भंडारण अवधि के साथ एक चर है एक बिंदु जहां यह दायरे में है करने के लिए दायरे में नहीं बीमार का गठन है जब तक चर अदिश प्रकार, एक छोटी सी डिफ़ॉल्ट निर्माता के साथ वर्ग प्रकार है और एक छोटा विनाशक, में से एक का सीवी-योग्य संस्करण, या में से किसी एक की सरणी और प्रारंभकर्ता के बिना घोषित किया गया है।

यह क्यों काम करना चाहिए? क्या इसकी परिभाषा पर कूदने और अपरिभाषित x का उपयोग करना अभी भी खतरनाक नहीं है? और प्रारंभकर्ता के अस्तित्व को कोई फर्क क्यों पड़ता है?

उत्तर

7

आप किसी भी तरह से x का उपयोग नहीं करेंगे, क्योंकि int x; जैसा कि यह प्राप्त होने वाला है, उतना ही प्रारंभिक है। प्रारंभकर्ता का अस्तित्व निश्चित रूप से एक अंतर बनाता है, क्योंकि आप इसे छोड़ देंगे। उदाहरण के लिए int x = 5;x शुरू करता है, इसलिए यदि आप इसे ऊपर छोड़ देते हैं या नहीं तो इससे कोई फर्क पड़ता है।

+0

लेकिन समस्या यह है कि, एक प्रारंभकर्ता है, एक्स को परिभाषित नहीं किया गया है क्योंकि इसकी परिभाषा वैसे भी बाईपास की गई है। यही है ना –

+0

@EricZ: परिभाषा अभी भी होती है। 'गोटो' एक रनटाइम चीज है, यह केवल प्रारंभिक व्यवहार जैसे रनटाइम व्यवहार को छोड़ देता है। – GManNickG

+0

@GMan, ठीक है! धन्यवाद;) –

2

क्या यह अभी भी इसकी परिभाषा पर कूदने और अनियमित x का उपयोग करने के लिए खतरनाक नहीं है?

लेकिन x वैसे भी शुरू नहीं किया जाएगा, क्योंकि इसे प्रारंभकर्ता के बिना घोषित किया गया था! तो gotox सेट (सॉर्ट-ऑफ-प्रारंभिक) सेट करने वाले असाइनमेंट स्टेटमेंट्स पर छोड़ सकता है, लेकिन यह आश्चर्य की बात नहीं है कि goto असाइनमेंट स्टेटमेंट्स पर छोड़ सकता है; और घोषणापत्र वास्तव में कुछ भी प्रारंभिक नहीं होने तक करता है।

+1

+1 * घोषणा स्वयं वास्तव में कुछ भी नहीं करती *। यह महत्वपूर्ण बात है। प्रारंभकर्ता के बिना, कोई कोड उत्पन्न नहीं होता है। नियम यह सुनिश्चित करते हैं कि आप वास्तव में किसी भी कोड पर नहीं जा रहे हैं। –

+0

@ ईरनेस्ट, मैं उत्सुक हूं कि एक्स को कैसे परिभाषित किया गया है क्योंकि इसकी परिभाषा का निधन हो गया है? –

+2

कल्पना कीजिए कि एक फ्री प्रोसेसर रजिस्टर को 'x' रखने के लिए नामित किया गया है। यह संकलक में बस बहीखाता है; उत्पन्न कोड में भौतिक रूप से कुछ भी नहीं है जो कहता है "रजिस्टर 17 अब' x' है। " अब, यदि 'x' प्रारंभ किया गया था, तो हमारे पास रजिस्टर के मूल्य को सेट करने के लिए कोड होगा - लेकिन जैसा कि हमने कहा था, इसमें से कोई भी नहीं है। –

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