मैं आश्चर्य की बात आज पता चला कि निम्नलिखित कोड पूरी तरह से वैध है (जीसीसी 4.4.5):पैरामीटर सी ++ पीछा के दिलचस्प मामला (पैरामीटर एक अगर ब्लॉक में छाया नहीं)
int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}
मैं वाकई हैरान हूँ। अगर मुझे इसे स्वीकार करना है, तो सुनिश्चित करें कि मैं कह सकता हूं कि यह समझ में आता है क्योंकि नया चर अपने ब्लॉक के भीतर है, इसलिए बाहर का शेष कोड अभी भी पैरामीटर तक पहुंच सकता है, इसलिए पैरामीटर वास्तव में छाया नहीं है। लेकिन यह अभी भी मुझे समझ में नहीं आता है कि हमने इसे एक अवैध वाक्यविन्यास क्यों नहीं बनाया? मुझे यह अनुमति देने का कोई लाभ नहीं दिखता है, और वास्तव में, मुझे इसके कारण एक बग में खोदना पड़ा। यह एक लंबा काम था और मैंने अपने स्वयं के चर को बनाया बिना यह पैरामीटर के समान नाम है, और बाद में कोड की कुछ पंक्तियां (उसी ब्लॉक) पर बहुत ही पैरामीटर चर पर निर्भरता है, और अब यह मेरे संस्करण का उपयोग कर रहा है और मेरे दिन का एक घंटा चला जाता है।
मेरे पास कंपाइलर्स के बारे में बहुत सतही जानकारी है, तो क्या कोई मुझे इस व्यवहार के पीछे पूरी कहानी समझा सकता है? तुलना के रूप में, जावा कोड में यह अमान्य है (डुप्लिकेट चर)।
कंपाइलरों में कोई विशेषज्ञ नहीं है, लेकिन मुझे इस तथ्य पर संदेह होगा कि तर्क एक int है और "छायांकन" चर केवल लूप में होना चाहिए। –
मैंने 'get_int (int i) 'भी कोशिश की है, इससे कोई फर्क नहीं पड़ता – user1861088
' int i' का दायरा वह ब्लॉक है जिसमें इसे घोषित किया गया है। यह ब्लॉक के अंदर पैरामीटर छाया करता है, लेकिन इसके बाहर नहीं। यदि आप पूछ रहे हैं "फ़ंक्शन के बजाय ब्लॉक पर एक चर स्कैन क्यों किया गया है?" जवाब यह है कि "भाषा नियम यही कहते हैं।" विभिन्न भाषाएं विभिन्न नियमों का पालन करती हैं। यही कारण है कि उन्हें अलग बनाता है। –