2013-05-06 3 views
5

मैं आश्चर्य की बात आज पता चला कि निम्नलिखित कोड पूरी तरह से वैध है (जीसीसी 4.4.5):पैरामीटर सी ++ पीछा के दिलचस्प मामला (पैरामीटर एक अगर ब्लॉक में छाया नहीं)

int get_int(const int& i) 
{ 
    if(i == 0) 
    { 
     int i = 1; 
     return i; 
    } 
    return i;  
} 

मैं वाकई हैरान हूँ। अगर मुझे इसे स्वीकार करना है, तो सुनिश्चित करें कि मैं कह सकता हूं कि यह समझ में आता है क्योंकि नया चर अपने ब्लॉक के भीतर है, इसलिए बाहर का शेष कोड अभी भी पैरामीटर तक पहुंच सकता है, इसलिए पैरामीटर वास्तव में छाया नहीं है। लेकिन यह अभी भी मुझे समझ में नहीं आता है कि हमने इसे एक अवैध वाक्यविन्यास क्यों नहीं बनाया? मुझे यह अनुमति देने का कोई लाभ नहीं दिखता है, और वास्तव में, मुझे इसके कारण एक बग में खोदना पड़ा। यह एक लंबा काम था और मैंने अपने स्वयं के चर को बनाया बिना यह पैरामीटर के समान नाम है, और बाद में कोड की कुछ पंक्तियां (उसी ब्लॉक) पर बहुत ही पैरामीटर चर पर निर्भरता है, और अब यह मेरे संस्करण का उपयोग कर रहा है और मेरे दिन का एक घंटा चला जाता है।

मेरे पास कंपाइलर्स के बारे में बहुत सतही जानकारी है, तो क्या कोई मुझे इस व्यवहार के पीछे पूरी कहानी समझा सकता है? तुलना के रूप में, जावा कोड में यह अमान्य है (डुप्लिकेट चर)।

+0

कंपाइलरों में कोई विशेषज्ञ नहीं है, लेकिन मुझे इस तथ्य पर संदेह होगा कि तर्क एक int है और "छायांकन" चर केवल लूप में होना चाहिए। –

+0

मैंने 'get_int (int i) 'भी कोशिश की है, इससे कोई फर्क नहीं पड़ता – user1861088

+5

' int i' का दायरा वह ब्लॉक है जिसमें इसे घोषित किया गया है। यह ब्लॉक के अंदर पैरामीटर छाया करता है, लेकिन इसके बाहर नहीं। यदि आप पूछ रहे हैं "फ़ंक्शन के बजाय ब्लॉक पर एक चर स्कैन क्यों किया गया है?" जवाब यह है कि "भाषा नियम यही कहते हैं।" विभिन्न भाषाएं विभिन्न नियमों का पालन करती हैं। यही कारण है कि उन्हें अलग बनाता है। –

उत्तर

1

"एक संदर्भ एक समारोह है कि इसके तर्क का मान बदलने के लिए माना जाता है लागू करने के लिए इस्तेमाल किया जा सकता" क्यों सी ++ इस अनुमति देता है , जवाब सरल है: वैध सी कोड स्वीकार करने के लिए।

यह नियमों को सरल बनाता है, अलग-अलग क्षेत्रों में एक ही पहचानकर्ता के लिए अलग-अलग अर्थों को संभालने के लिए, समान रूप से, बिना किसी स्कोप में नामस्थान, कक्षाएं, कार्य, या ब्लॉक स्कोप्स हैं।

+0

दिमाग थोड़ा और समझाता है? क्या आप स्पष्ट कर सकते हैं कि वैध सी कोड को स्वीकार करने के साथ इसका क्या संबंध है? – user1861088

+0

सी ++ की लोकप्रियता जब इसे पेश की गई थी, इस तथ्य पर निर्भर था कि सी ++ नियमों के तहत बहुत अच्छा सी कोड स्वीकार्य था। –

-4

आप एक चरणीय लेकिन संदर्भ नहीं दे रहे हैं। में Bjarne Stroustroup का हवाला देते हुए सी ++ प्रोग्रामिंग भाषा - आप पूछ रहे हैं p.62

+0

यह प्रश्न के बिंदु को याद करता है, जो "मुझे पैरामीटर को आंशिक रूप से छाया करने की अनुमति क्यों है?" –

+0

आपको प्रश्न नहीं मिला .. माफ करना मैंने इसे एक स्पष्ट तरीके से नहीं रखा। इसके अलावा मैंने एक कॉन्स संदर्भ में पारित किया है, इसलिए इससे कोई फर्क नहीं पड़ता है – user1861088

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