2015-10-01 22 views
40

इस कोड को संकलित करता है में एक ही नाम के साथ एक चर का उपयोग करना है, लेकिन मेरे पास है Visual Studio में एक रन समय त्रुटि:विभिन्न रिक्त स्थान

रन-समय जांच विफलता # 3 - चर 'एक्स' के बिना किया जा रहा है प्रारंभ किया जा रहा ...

int x = 15; 
int main() 
{ 
    int x = x; 
    return 0; 
} 

मुझे लगता है कि व्यवहार ... त्रुटि बॉक्स में समझ में नहीं आता है जब मैं जारी रखने के लिए क्लिक करें कार्यक्रम शुरू और एक्स कोई दूषित सामग्री (15 की तरह -8556328 बजाय) है।

यह कोड बिना किसी समस्या के काम करता है, और int सरणी अच्छी तरह से घोषित की जाती है?

const int x = 5; 
int main() 
{ 
    int x[x] = {1,2,3,4}; 
    return 0; 
} 
+17

लिखने की आवश्यकता है आपने सी और सी ++ दोनों को टैग किया है। आपने किस संकलन किया? –

+3

कुछ दिलचस्प तथ्यों: 'gcc 4.8.4', संकलित और इस प्रोग्राम को '-Wall -Wextra -pedantic' चालू किया जा सकता है। 'clang 7.0.0' इसे संकलित करता है, और इसे चलाया जा सकता है। हालांकि अगर 'printf ("% d \ n", x);' int x = x; 'के बाद जोड़ा गया है (मुझे लगता है कि' x' का वास्तविक उपयोग), संकलक अधिक अनुकूल चेतावनी देता है: 'चेतावनी: चर 'x' अनियमित है जब अपने प्रारंभिकरण में उपयोग किया जाता है [-नुनिनिश्लाइज्ड] '। 'gcc' अभी भी संकलित करता है और इसे 'printf' और मुद्रित' 0' के साथ भी चलाता है। हालांकि वालग्रिंड के माध्यम से कार्यक्रम चलाते हुए 'सशर्त कूद या चाल' अनियमित मूल्य (ओं) ' – Joakim

+0

@ जोकीम पर निर्भर करता है: दिलचस्प; परिणामों के लिए धन्यवाद।क्या जीसीसी और क्लैंग उनके अधिकारों में हैं, यानी यह कैननिक रूप से अपरिभाषित व्यवहार है? –

उत्तर

51

x= के बाईं पर परिभाषित किया गया है।

तो x[x] में, [x] वैश्विक एक के लिए, का उल्लेख

x = x; में, x छुपाता वैश्विक x और खुद से initializes जबकि -> यूबी।

35

जब आप एक नया चर घोषित, इसका नाम दिखाई यहीं

int x = 
//  ^- there 

हो जाता है, क्योंकि यह उस समय चर पूरी तरह से घोषित किया जाता है पर है, और इस तरह के रूप; इसका नाम कुछ मतलब है। इस बिंदु पर आसपास के दायरे में किसी भी अन्य (पहले घोषित चर) छुपाया जाएगा।

5

सी में कोई गुंजाइश नहीं संकल्प ऑपरेटर नहीं है, तो आप अपने कार्यक्रम में

int x = x; 

उपयोग करने में सक्षम नहीं हो सकता।

+7

ओपी को यह नहीं लगता कि वे सी या सी ++ के लिए उत्तर चाहते हैं या नहीं। उत्तरार्द्ध समर्थन स्कोप संकल्प करता है। –

+0

मुझे लगता है कि यह संकलित करता है कि मैंने इसे c compiler के साथ ideone.com में चेक किया है ... – Aminos

+0

@underscore_d, हाँ सी ++ समर्थन करता है और सी नहीं करता है। – Adi

1

कृपया एसआरओ (स्कोप रिज़ॉल्यूशन ऑपरेटर: :) का उपयोग करें कंपाइलर को बताएं कि एक्स आपके दिमाग में वास्तविक एक्स है। उपयोगकर्ता परिभाषित नाम (नाम सजाया जाता है) घायल हैं, क्योंकि यह के स्तर पर अस्पष्टता से बचने के कुछ इस तरह, ये सिर्फ संकलक द्वारा इस्तेमाल किया नाम है कि सबसे अच्छा यह सूट

int x = 15;// Real name = gui_x 
int main() 
{ 
    int x = x;// lui_x 
    return 0; 
} 

इस तरह से चलाने के समय कौन-सा संस्करण पता चल जाएगा में हैं आप उपयोग कर रहे हैं लेकिन अस्पष्टता से बचने के लिए यह आपके द्वारा विशिष्ट नामों का उपयोग करने की अपेक्षा करता है। कभी-कभी समस्या उत्पन्न होती है जहां आप नहीं जानते कि आप पहले से ही इस्तेमाल किए गए नामों का उपयोग कर रहे हैं। इस सी ++ के लिए एसआरओ बनाया है।
अब सरणी x के मामले में पता & पूर्णांक नहीं है जो कुछ स्टोर करता है, यही कारण है कि संकलक झुका हुआ नहीं था। आपको

namespace abc //now all global variables are belongs to this ns abc 
int x = 15;// Real name = gui_x 
int main() 
{ 
int x = abc::x;// lui_x 
return 0; 
} 
संबंधित मुद्दे