c++ - मैं एक स्थिरांक का उपयोग करके एक सरणी की लंबाई को परिभाषित कर सकता हूं, तो यह काम क्यों नहीं?




(4)

b और c के बीच अंतर क्या हैं?

c का एक संकलन समय स्थिर आरंभीकरण है, जबकि b नहीं करता है। संकलित समय स्थिरांक के साथ एक कास्ट ऑब्जेक्ट अपने आप में एक संकलन समय स्थिर मान है।

चूँकि मैं एक स्थिरांक का उपयोग करके एक अरथी के एक दसवें हिस्से को परिभाषित कर सकता हूं, इसलिए यह काम क्यों नहीं?

बस कोई भी निरंतर नहीं करेगा। const क्वालिफायर का तात्पर्य रनटाइम कॉन्स्टेंस है (यानी मूल्य रनटाइम पर निर्धारित किया जा सकता है लेकिन ऑब्जेक्ट के पूरे जीवनकाल में नहीं बदलेगा)। केवल संकलन समय निरंतर मान सरणी आकार के रूप में उपयोग किया जा सकता है।

    int a = 5;
    const int b = a, c = 4;

    int e[a];
    int d[b];
    int f[c];

f[c] की परिभाषा मान्य है।
चर b भी एक स्थिर int , लेकिन संकलक ने मुझे त्रुटि दी " लाइन int d[b] लिए " निरंतर मान होना चाहिए " b और c बीच अंतर क्या हैं?


"कॉन्स्ट" का अर्थ केवल यह है कि परिवर्तनशील समय में चर नहीं बदलेगा, और इसका अर्थ यह नहीं है कि संकलन समय पर इसका मूल्य घटाया जा सकता है।

मुझे लगता है कि आप जो देख रहे हैं वह "बाधा" है। शायद आप इसे इस तरह आज़मा सकते हैं:

constexpr int b = 4; // can't be assigned from a!
int d[b];

इसके बजाय "कॉन्स्ट्रेप" का अर्थ है "वास्तविक कास्ट" और "कॉन्स्ट" का अर्थ केवल "नॉन-चेंजिंग वर्जन" है, क्योंकि कुछ ऐतिहासिक कारण हैं। यह ध्यान में रखना चाहिए कि c ++ में एक देशी सरणी हमेशा निश्चित-लंबाई वाली होती है जैसा @Bathsheba ने कहा।


आप स्थिरांक को मान प्रदान करने के लिए एक गैर-स्थिर चर का उपयोग कर रहे हैं। इसलिए, उस चर का मान संकलन समय निर्धारित नहीं किया जा सकता है । मुझे पता है कि आप a नहीं बदल रहे हैं, लेकिन कंपाइलर ऐसा नहीं सोचता।


कंपाइलर डायग्नोस्टिक को वास्तव में समय का मूल्यांकन करने योग्य स्थिर अभिव्यक्ति होना चाहिए।

चूँकि मूल वस्तु जिसको b असाइन किया गया है, वह const नहीं है, b एक संकलित समय मूल्यांकन योग्य स्थिर अभिव्यक्ति नहीं है, इसलिए संकलन विफल हो जाएगा क्योंकि चर लंबाई arrays मानक C ++ में समर्थित नहीं हैं।







c++