/ / C, if-else स्टेटमेंट का उपयोग करते हुए कॉन्स्टेबल वैरिएबल का समर्थन क्यों नहीं करता है? - सी, कांस्ट

सी अगर किसी और कथन का उपयोग कर कॉन्स्ट चर का प्रारंभ करने का समर्थन क्यों नहीं करता है? - सी, कॉन्स

मैं एक इनिशियलाइज़ करना चाहता हूँ const चर का उपयोग कर एक यदि नहीं तो.
उदाहरण के लिए:

const int foo;
if (bar) {
foo = 1;
} else {
foo = 2;
}

जावा में, यह कानूनी कोड है (उपयोग करके final के बजाय const)। कारण यह है कि सभी संभावित परिणामों में, चर को एक बार सौंपा गया है और कभी भी पुन: असाइन नहीं किया गया है। सी में, यह कानूनी कोड नहीं है। क्या कारण है कि यह "सी में कानूनी कोड नहीं हो सकता है?

उत्तर:

उत्तर № 1 के लिए 6

आप टर्नरी ऑपरेटर का उपयोग कर सकते हैं, लेकिन ध्यान रखें कि स्थिर या थ्रेड-लोकल स्टोरेज क्लास वाले ऑब्जेक्ट्स के लिए, इनिशियलाइज़र एक्सप्रेशन को कंपाइल-टाइम कॉन्स्टेंट होने की आवश्यकता है:

const int bar =  42;
#define BAR 42

#if 0
const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
const int foo = BAR ? 1 : 2;
#endif

void fn(void)
{
const int foo = bar ? 1 : 2;
#if 0
static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
static const int stc_foo = BAR ? 1 : 2;
#endif
}

कारण अगर एक और बयान "टी के लिए इस्तेमाल किया जा सकता हैआरंभीकरण इसलिए है क्योंकि इसकी अनुमति से सी व्याकरण में कुछ व्यापक बदलाव की आवश्यकता होगी, और यह संभवतः सी व्याकरण और शब्दार्थ को और अधिक जटिल बना देगा।

मूल रूप से, इसके बजाय केवल यह सत्यापित करने के लिए कि घोषणाकर्ता द्वारा पीछा किया जाता है = और एक initializer एक्सप्रेशन और वह इनीशियल एक्सप्रेशनएक स्थिरांक है, संकलक को प्रत्येक स्थिर / थ्रेड-लोकल वैरिएबल को याद रखना होगा जो आरंभीकृत नहीं किया गया है और फिर बिना शर्त संकलित संकलन-समय मूल्यांकन योग्य शाखाओं की तलाश करता है जो इसे करने के लिए असाइन करते हैं और इनिशियलाइज़ेशन के लिए उपयोग करते हैं।

इसके अलावा, बयानों की अनुमति होगीफ़ाइल स्कोप में (वर्तमान सी व्याकरण में फ़ाइल स्कोप में स्टेटमेंट की अनुमति नहीं है) और अनुवाद-यूनिट-लोकल ग्लोबल वैरिएबल्स के लिए लिखने के लिए सीमित गति और मेमोरी एक्सेस के लिए सत्यापित है। वैकल्पिक रूप से, उन्हें स्पष्ट रूप से वैश्विक निर्माणकर्ताओं में बदल दिया जा सकता है, लेकिन यह अतिरिक्त समस्याओं को पेश करेगा जैसे कि संकलन इकाइयों के बीच कंस्ट्रक्टर ऑर्डर करना (जो कि निर्माणकर्ता को निहित किया गया था, तो यह हल करना मुश्किल होगा), पहले वैश्विक निर्माता का समर्थन करने के लिए कार्यान्वयन की आवश्यकता जगह, या स्थिर चर असाइनमेंट की वर्तमान में सीधी प्रदर्शन विशेषताओं के धुंधला हो जाना।


जवाब के लिए 16 № 2

आप इनिशियलाइज़ कर सकते हैं foo चर सशर्त रूप से के माध्यम से टर्नरी ऑपरेटर:

const int foo = bar ? 1 : 2;

ध्यान दें, यदि foo एक स्वचालित चर नहीं है, तो संकलन अभिव्यक्ति का संकलन-समय पर मूल्यांकन किया जाना चाहिए, अन्यथा यह "टी संकलन" जीता।


जवाब के लिए 3 № 3

सी में, स्थिरांक परिवर्तनशील बनाता है सिफ़ पढ़िये.

आप इनिशियलाइज़ कर सकते हैं स्थिरांक केवल घोषणा के समय परिवर्तनशील, उसके बाद नहीं जैसा कि यह केवल पढ़ने के लिए हो जाता है।

यही कारण है कि आपका कोड C में कानूनी नहीं है, जैसा कि आप हैं केवल-पढ़ने के लिए अद्यतन करना चर।

आशा है कि यह मदद करेगा !!