Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C में वेरिएबल्स कैसे स्कोप्ड होते हैं

C में स्टैटिक स्कोपिंग

यहां हम देखेंगे कि C वेरिएबल्स कैसे स्कोप्ड होते हैं। C में वेरिएबल्स हमेशा **स्टैटिकली स्कोप्ड** (लेक्सिकली स्कोप्ड) होते हैं। एक वेरिएबल की बाइंडिंग, प्रोग्राम टेक्स्ट द्वारा निर्धारित की जा सकती है। ये रनटाइम फ़ंक्शन कॉल स्टैक से स्वतंत्र हैं।

उदाहरण

#include <stdio.h>

int x = 0;  // ग्लोबल x

int my_function() {
    return x;  // हमेशा ग्लोबल x का उपयोग करता है
}

int my_function2() {
    int x = 1;  // लोकल x (ग्लोबल को छुपाता है)
    return my_function();  // my_function को कॉल करता है
}

int main() {
    printf("The value is: %d\n", my_function2());
    return 0;
}

आउटपुट

The value is: 0

व्याख्या

परिणाम 0 है। क्योंकि my_function() द्वारा रिटर्न किया गया मान उस फ़ंक्शन पर निर्भर नहीं करता जो इसे कॉल कर रहा है। यह फ़ंक्शन हमेशा ग्लोबल वेरिएबल x का मान लौटाता है। my_function2 में लोकल x का my_function पर कोई प्रभाव नहीं पड़ता।

स्टैटिक vs डायनामिक स्कोपिंग

पहलूस्टैटिक (लेक्सिकल) स्कोपिंगडायनामिक स्कोपिंग
बाइंडिंग समयकंपाइल टाइमरनटाइम
निर्धारित होता हैसोर्स कोड संरचना द्वाराकॉल स्टैक द्वारा
उदाहरण भाषाएंC, C++, Java, Pythonपुराना Lisp, Perl (local), Bash
उपरोक्त उदाहरण में परिणाम0 (ग्लोबल x)1 (कॉलर का x होता)

C में स्कोप नियम

1. ब्लॉक स्कोप

void func() {
    int a = 1;  // func के ब्लॉक तक स्कोप
    if (true) {
        int b = 2;  // इस ब्लॉक तक स्कोप
        // a यहाँ विजिबल है
    }
    // b यहाँ विजिबल नहीं है
}

2. फाइल स्कोप (ग्लोबल)

int global = 10;  // इस फाइल में सभी जगह विजिबल
static int file_private = 20;  // केवल इस फाइल में विजिबल (इंटरनल लिंकेज)

3. फंक्शन प्रोटोटाइप स्कोप

void func(int x);  // x केवल इस प्रोटोटाइप तक स्कोप्ड

4. फंक्शन स्कोप (लेबल्स)

void func() {
    goto label;  // label पूरे फंक्शन में विजिबल
    // ...
label:
    ;
}

शैडोइंग

आंतरिक स्कोप में वेरिएबल बाहरी स्कोप के समान नाम वाले वेरिएबल को छुपा सकता है:

int x = 10;  // ग्लोबल

void func() {
    int x = 20;  // ग्लोबल x को शैडो करता है
    {
        int x = 30;  // दोनों को शैडो करता है
        // यहाँ x = 30
    }
    // यहाँ x = 20
}
// यहाँ x = 10

बेस्ट प्रैक्टिसेज

  • ग्लोबल वेरिएबल्स से बचें; पैरामीटर्स पास करें
  • सबसे संकीर्ण संभव स्कोप का उपयोग करें
  • शैडोइंग से बचें (कंपाइलर वार्निंग्स सक्षम करें: -Wshadow)
  • फाइल-प्राइवेट ग्लोबल्स के लिए static का उपयोग करें
  • कॉन्स्टेंट्स के लिए const और constexpr पसंद करें
  1. - JavaScript चर कहां संग्रहीत होते हैं?

    कई अन्य प्रोग्रामिंग भाषाओं की तरह, JavaScript में चर होते हैं। चरों को नामित कंटेनर के रूप में माना जा सकता है। आप इन कंटेनरों में डेटा रख सकते हैं और फिर केवल कंटेनर का नाम लेकर डेटा को संदर्भित कर सकते हैं। JavaScript चर ब्राउज़र प्रक्रिया की मेमोरी में संग्रहीत होते हैं। चरों को संग्रहीत करने क

  1. JavaScript में ब्लॉक-स्कोप्ड वेरिएबल कैसे घोषित करें? JavaScript में ब्लॉक-स्कोप्ड वेरिएबल कैसे घोषित करें?

    ब्लॉक-स्कोप्ड वेरिएबल घोषित करने के लिए, हम ES2015 में पेश किए गए कीवर्ड let और const का उपयोग करते हैं। उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-sc

  1. एंड्रॉइड में ग्लोबल वेरिएबल कैसे घोषित करें? एंड्रॉइड में ग्लोबल वेरिएबल कैसे घोषित करें?

    एंड्रॉइड में ग्लोबल/शेयर्ड स्टेट प्रबंधित करना ग्लोबल वेरिएबल एंड्रॉइड में मौजूद नहीं हैं जैसे वे C/C++ में होते हैं। इसके बजाय, हम दायरे और जीवनचक्र के आधार पर कई पैटर्न का उपयोग करते हैं: Application उपवर्ग, सिंगलटन, ViewModel, SharedPreferences, या डिपेंडेंसी इंजेक्शन (Hilt/Koin)। पैटर्न 1 - App