स्थैतिक कास्ट और कॉन्स्ट के बीच अंतर क्या है?


84

बीच क्या अंतर है static constऔर const? उदाहरण के लिए:

क्या उनके बीच कोई अंतर है? आप एक दूसरे का उपयोग कब करेंगे?



5
फिर से खोलने की वोटिंग की गई। "डुप्लिकेट" मेमोरी उपयोग के लिए एक पूरी तरह से अलग सवाल पूछ रहा है। यह प्रश्न अंतर के बारे में अधिक सामान्य प्रश्न पूछता है।
राम

जवाबों:


58

अंतर लिंकेज है।

यदि iऑब्जेक्ट अनुवाद इकाई के बाहर उपयोग नहीं किया जाता है, जहां इसे परिभाषित किया गया है, तो आपको इसे staticनिर्दिष्टकर्ता के साथ घोषित करना चाहिए ।

यह संकलक (संभावित) को और अधिक अनुकूलन करने में सक्षम बनाता है और पाठक को सूचित करता है कि वस्तु का उपयोग इसके अनुवाद इकाई के बाहर नहीं किया गया है।


8
+1 यह बहुत अच्छा होगा यदि आप यह भी जोड़ सकते हैं कि इसका क्या मतलब है यदि वे घोषणाएँ किसी फ़ंक्शन के भीतर हैं।
प्रेटोरियन

क्या आपको यकीन है कि const int i = 5;बाहरी संबंध हैं ?? C ++ में यह नहीं है ...
Kerrek SB

4
@KerrekSB फ़ाइल-स्कोप पर, हाँ। (C99, 6.2.2p5) "यदि किसी ऑब्जेक्ट के लिए पहचानकर्ता की घोषणा में फ़ाइल स्कोप है और कोई स्टोरेज-क्लास स्पेसियर नहीं है, तो इसका लिंकेज बाहरी है।"
21

13
@KerrekSB: C और C ++ समान भाषा नहीं हैं। विशेष रूप से, C constका C ++ से कोई लेना-देना नहीं है const
आर .. गिटहब स्टॉप हेल्पिंग ICE

क्या संकलक वास्तव में स्थिर पर आधारित अनुकूलन करते हैं? ऐसा लगता है कि यह मान लेना सुरक्षित नहीं है कि इसकी अनुवाद इकाई के बाहर एक स्थिर वस्तु का उपयोग नहीं किया जाता है क्योंकि यह अभी भी गैर-स्थिर फ़ंक्शन द्वारा पारित किया जा सकता है या गैर-स्थिर वैश्विक सूचक द्वारा इंगित किया जा सकता है।
एन.वी.

99

staticएक फ़ंक्शन के बाहर दृश्यता या अंदर एक चर जीवनकाल निर्धारित करता है। तो इसका constप्रति se से कोई लेना देना नहीं है।

const इसका मतलब यह है कि इसके आरंभ होने के बाद आप मूल्य नहीं बदल रहे हैं।

static फ़ंक्शन के अंदर का मतलब है कि फ़ंक्शन समाप्त होने से पहले और बाद में चर मौजूद होगा।

staticएक फ़ंक्शन के बाहर का मतलब है कि चिह्नित चिह्न का दायरा staticउस .c फ़ाइल तक सीमित है और इसे बाहर नहीं देखा जा सकता है।

तकनीकी रूप से (यदि आप इसे देखना चाहते हैं), staticएक स्टोरेज स्पेसिफायर है और constएक प्रकार का क्वालीफायर है।


0

const int i = 5;
i मान यदि आप एक पॉइंटर का उपयोग करके संशोधित कर सकते हैं यदि मुझे परिभाषित किया गया है और स्थानीय रूप से घोषित किया गया है, अगर यह स्थिर कॉन्स्टेंस int a = 5 है; या const int i = 5; वैश्विक रूप से, आप संशोधित नहीं कर सकते क्योंकि यह डेटा सेगमेंट में आरओ मेमोरी में संग्रहीत है।


-1

यह इस बात पर निर्भर करता है कि ये परिभाषाएँ किसी कार्य के अंदर हैं या नहीं। एक समारोह के बाहर मामले के लिए जवाब ouah द्वारा दिया गया है, ऊपर। किसी फ़ंक्शन के अंदर का प्रभाव अलग होता है, जिसका उदाहरण नीचे दिया गया है:

यदि आप चाहते हैं कि एक स्थानीय चर "वास्तव में स्थिर" हो, तो आपको इसे न केवल "कॉन्स्ट" बल्कि "स्थिर कास्ट" को परिभाषित करना होगा।


यह मेरे लिए पूरी तरह से संकलन करता है ... लेकिन मुझे पता है कि इस मामले में एक स्थिर कॉन्स्टेबल चर होना बेवकूफी है।
ढोल

1
@ डॉरम यह बेवकूफी नहीं है। fooवैरिएबल के मामले में हर बार रि-इनिशियलाइज़ किए जाने my_function()को कहा जाता है, जिसके परिणामस्वरूप एक अलग यादृच्छिक मान असाइन किया जाता है। barकेवल एक बार शुरू होने वाले चर के मामले में , पहली बार my_function()कहा जाता है जिसके परिणामस्वरूप कार्यक्रम के जीवनकाल के लिए एक ही मूल्य सौंपा जा रहा है। इसलिए स्थिर भंडारण अवधि।
jb

1
दरअसल, आगे के प्रतिबिंब पर, यह इस बात पर निर्भर करता है कि हम C या C ++ का उपयोग कर रहे हैं या नहीं। प्रश्न C को टैग किया जाता है, जिस स्थिति में हम संकलन-समय स्थिर नहीं होने के barकारण असाइनमेंट के लिए एक कंपाइल एरर प्राप्त करते हैं rand()
jb

1
@nibot आप स्पष्ट कर सकते हैं कि स्टोरेज स्पेसिफिकेशन और टाइप क्वालिफिकेशन के संदर्भ में "प्रभाव अलग है" और "वास्तव में स्थिर" से आपका क्या मतलब है?
jb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.