निम्नलिखित "सी" कोड पर विचार करें:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
स्रोत कोड के अंत में परिभाषित किया गया है और इसके उपयोग से पहले कोई घोषणा प्रदान नहीं की गई है main()
। जब कंपाइलर देखता Func_i()
है main()
, उसी समय वह बाहर आ जाता है main()
और उसे पता चलता है Func_i()
। कंपाइलर किसी तरह मूल्य को वापस पाता है Func_i()
और उसे देता है printf()
। मुझे यह भी पता है कि कंपाइलर रिटर्न प्रकार नहीं पा सकता है Func_i()
। यह द्वारा चूक (अनुमान?) लेता वापसी प्रकार के Func_i()
होने के लिए int
। यदि कोड था float Func_i()
तो संकलक त्रुटि देगा: के लिए संघर्षशील प्रकारFunc_i()
।
उपरोक्त चर्चा से हम देखते हैं कि:
संकलक द्वारा दिए गए मान को पा सकता है
Func_i()
।- यदि कंपाइलर
Func_i()
बाहर से आकरmain()
और सोर्स कोड को खोजकर लौटाए गए मान का पता लगा सकता है , तो वह Func_i () का प्रकार क्यों नहीं खोज सकता, जिसका स्पष्ट उल्लेख किया गया है।
- यदि कंपाइलर
संकलक को पता होना चाहिए कि
Func_i()
प्रकार फ़्लोट का है - इसलिए यह परस्पर विरोधी प्रकारों की त्रुटि देता है।
- यदि संकलक जानता है कि
Func_i
प्रकार फ़्लोट का है, तो यह अभी भीFunc_i()
टाइप इंट का क्यों मानता है, और परस्पर विरोधी प्रकारों की त्रुटि देता है? यह बलपूर्वकFunc_i()
फ्लोट के प्रकार का क्यों नहीं होता है ।
मुझे चर घोषणा के साथ एक ही संदेह है । निम्नलिखित "सी" कोड पर विचार करें:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
संकलक त्रुटि देता है: 'Data_i' अघोषित (इस फ़ंक्शन में पहला उपयोग)।
- जब कंपाइलर देखता है
Func_i()
, तो यह Func_ () द्वारा लौटाए गए मान को खोजने के लिए स्रोत कोड पर जाता है। कंपाइलर चर Data_i के लिए समान क्यों नहीं कर सकता है?
संपादित करें:
मुझे कंपाइलर, असेंबलर, प्रोसेसर आदि की आंतरिक कार्यप्रणाली का विवरण नहीं पता है। मेरे प्रश्न का मूल विचार यह है कि यदि मैं उपयोग के बाद स्रोत कोड में फ़ंक्शन के रिटर्न-वैल्यू को बताऊं (लिखूं) उस फ़ंक्शन के बाद "सी" भाषा कंप्यूटर को बिना कोई त्रुटि दिए उस मूल्य को खोजने की अनुमति देती है। अब कंप्यूटर समान प्रकार क्यों नहीं खोज सकता है। Data_i के प्रकार को Func_i () के रिटर्न मान के रूप में क्यों नहीं पाया जा सकता है। यहां तक कि अगर मैं extern data-type identifier;
बयान का उपयोग करता हूं, तो मैं उस पहचानकर्ता (फ़ंक्शन / चर) द्वारा वापस किए जाने वाले मूल्य को नहीं बता रहा हूं। अगर कंप्यूटर उस मूल्य को पा सकता है तो वह प्रकार क्यों नहीं खोज सकता है। हमें आगे की घोषणा की आवश्यकता क्यों है?
धन्यवाद।
Func_i
अमान्य की निहित घोषणा की । कभी भी अपरिभाषित चर घोषित करने का नियम नहीं था, इसलिए दूसरा टुकड़ा हमेशा विकृत था। (हाँ, संकलक पहले नमूने को अभी भी स्वीकार करते हैं क्योंकि यह वैध था, अगर मैला, C89 / C90 के तहत।)