C भाषा में स्कोप रूल्स Scope Rules in C
C भाषा में, स्कोप (scope) का अर्थ होता है कि एक वेरिएबल, फंक्शन या अन्य संरचनाओं का उपयोग कितने से लेकर किस स्थान तक सीमित होता है। यह एक निर्दिष्ट क्षेत्र होता है जिसमें उन्हें उपयोग किया जा सकता हैं।
C में, दो प्रकार के स्कोप होते हैं - ब्लॉक स्कोप और फंक्शन स्कोप।
ब्लॉक स्कोप के अनुसार, एक वेरिएबल या संरचना जो एक ब्लॉक में वर्णित होती है, केवल उस ब्लॉक में ही उपलब्ध होती है। यह ब्लॉक स्कोप एक लोकल वेरिएबल को संबोधित करता है।
फंक्शन स्कोप के अनुसार, एक वेरिएबल जो एक फंक्शन में वर्णित होती है, केवल उस फंक्शन में ही उपलब्ध होती है। यह फंक्शन स्कोप एक लोकल वेरिएबल को संबोधित करता है।
स्कोप नियमों के उपयोग से, प्रोग्रामर संभवतः विभिन्न वेरिएबल्स और संवेदनशील घटक के नामों को अलग-अलग ब्लॉकों या फ़ंक्शनों में उपयोग कर सकते हैं, जिससे उन्हें संरचित और समझना आसान होता है। इसके अलावा, स्कोप नियमों का उपयोग प्रोग्रामर के द्वारा लिखे गए कोड में लाभ होता है, क्योंकि इससे उन्हें वेरिएबल्स और संवेदनशील घटक के साथ होने वाली अन्य त्रुटियों से बचाया जा सकता है। C प्रोग्रामिंग लैंग्वेज में वेरिएबल्स को तीन जगहों पर डिक्लेयर किया जा सकता है:
- फंक्शन या ब्लॉक के अंदर जिसे लोकल वेरिएबल्स कहा जाता है,
- सभी फंक्शन्स के बाहर जिसे ग्लोबल वेरिएबल्स कहा जाता है।
- Function Parameters की परिभाषा में जिसे Formal Parameters कहा जाता है।
वेरिएबल्स को डिक्लेयर करना
वेरिएबल्स को तीन जगहों पर डिक्लेयर कर सकते है
फ़ंक्शन के अंदर: जब आप एक फ़ंक्शन के अंदर एक वेरिएबल डिक्लेयर करते हैं, तो वेरिएबल सिर्फ उस फ़ंक्शन में ही उपलब्ध होता है। जब फ़ंक्शन समाप्त होता है, तो वेरिएबल बदलावों के साथ समाप्त हो जाता है।
फ़ंक्शन के बाहर लेकिन फ़ाइल के शुरुआत में: जब आप फ़ाइल के शुरुआत में एक वेरिएबल डिक्लेयर करते हैं, तो वेरिएबल फ़ाइल के अन्य सभी फ़ंक्शनों में उपलब्ध होता है। इसको "फ़ाइल स्कोप" वेरिएबल कहा जाता है।
फ़ाइल के बाहर: जब आप एक फ़ाइल के बाहर एक वेरिएबल डिक्लेयर करते हैं, तो वेरिएबल अन्य फ़ाइलों में उपलब्ध होता है। इसको "ग्लोबल स्कोप" वेरिएबल कहा जाता है।
ध्यान देने वाली बात यह है कि जब आप एक वेरिएबल को एक फ़ंक्शन के अंदर डिक्लेयर करते हैं, तो आप उसे फ़ंक्शन के बाहर भी उपयोग कर सकते हैं,
C भाषा में लोकल, ग्लोबल और फॉर्मल वेरिएबल
C भाषा में तीन प्रकार के वेरिएबल होते हैं - लोकल (local), ग्लोबल (global) और फॉर्मल (formal)। इन्हें निम्नलिखित तरीके से परिभाषित किया जा सकता है:
लोकल (Local) वेरिएबल - जब एक वेरिएबल को फ़ंक्शन में डिक्लेयर किया जाता है, तो वह लोकल वेरिएबल के रूप में जाना जाता है। यह वेरिएबल सिर्फ उस फ़ंक्शन के भीतर ही उपलब्ध होता है जिसमें वह डिक्लेयर किया गया है। इसके बाद, यह वेरिएबल सिर्फ उस फ़ंक्शन के अंत तक जीवित रहता है।
- लोकल वेरिएबल एक फ़ंक्शन के भीतर स्थानांतरित होते हैं और फ़ंक्शन के विभिन्न ब्लॉक्स में उपलब्ध होते हैं।
- लोकल वेरिएबल्स उपयोगकर्ता द्वारा दिए गए डेटा को फ़ंक्शन में संग्रहीत करने में मदद करते हैं और फ़ंक्शन के भीतर वे स्थानांतरित होते हैं।
उदाहरण
C भाषा में लोकल वेरिएबल एक ऐसी वेरिएबल होती है जो किसी फ़ंक्शन के भीतर डिक्लेयर की जाती है और जो केवल उस फ़ंक्शन के भीतर ही स्थानांतरित होती है। इसका उपयोग फ़ंक्शन के भीतर उपलब्ध डेटा को संग्रहीत करने में किया जाता है।
यहां एक उदाहरण दिया गया है जो इस विषय को समझने में मदद करेगा।
#include <stdio.h>
int main() {
int a = 10; //ग्लोबल वेरिएबल
int b = 20; //ग्लोबल वेरिएबल
printf("a = %d, b = %d\n", a, b);
{
int a = 30; //लोकल वेरिएबल
int b = 40; //लोकल वेरिएबल
printf("a = %d, b = %d\n", a, b);
}
printf("a = %d, b = %d\n", a, b);
return 0;
}
इस प्रोग्राम में, दो ग्लोबल वेरिएबल a और b डिक्लेयर किए गए हैं। फ़ंक्शन के भीतर एक ब्लॉक में एक नया ब्लॉक खोला गया है जिसमें दो लोकल वेरिएबल a और b डिक्लेयर किए गए हैं। यह लोकल वेरिएबल ब्लॉक में ही स्थानांतरित होते हैं और फंक्शन के बाहर अनुपलब्ध हो जाते हैं।
इस प्रोग्राम का आउटपुट निम्नलिखित होगा:
a = 10, b = 20
a = 30, b = 40
a = 10, b = 20
यह दिखाता है कि लोकल वेरिएबल्स केवल उनके संबंधित ब्लॉक में ही उपलब्ध होते हैं और इनका उपयोग उस ब्लॉक में ही किया जा सकता है। इसके अलावा, लोकल वेरिएबल और फंक्शन के अन्य भागों में डिक्लेयर किए गए ग्लोबल वेरिएबल्स के नाम में कोई भेदभाव नहीं किया जाता है।
ग्लोबल (Global) वेरिएबल - जब एक वेरिएबल को किसी फ़ंक्शन के बाहर डिक्लेयर किया जाता है, तो वह ग्लोबल वेरिएबल के रूप में जाना जाता है। इसका मतलब यह है कि वेरिएबल फ़ाइल में से किसी भी फ़ंक्शन से उपयोग किया जा सकता है।
- ग्लोबल वेरिएबल पूरे प्रोग्राम में उपलब्ध होते हैं जो सभी फ़ंक्शन में उपयोग किए जा सकते हैं।
- ग्लोबल वेरिएबल्स उपयोगकर्ता द्वारा पूरे प्रोग्राम में उपलब्ध रहते हैं, जिससे वे पूरे प्रोग्राम में संग्रहीत डेटा के रूप में उपयोग किए जा सकते हैं।
उदाहरण
सी भाषा में एक ग्लोबल वेरिएबल वह वेरिएबल होता है जिसे पूरे प्रोग्राम के भीतर किसी भी स्थान से एकसाथ एक ही नाम से डिफाइन किया जाता है। ग्लोबल वेरिएबल को ब्लॉक के बाहर या फंक्शन के बाहर डिक्लेयर किया जाता है।
ग्लोबल वेरिएबल्स एक प्रोग्राम में कई फंक्शनों द्वारा उपयोग किए जा सकते हैं। इनकी एक स्कोप होती है जो प्रोग्राम के सभी फंक्शन में होती है। ग्लोबल वेरिएबल्स को फंक्शन के बाहर डिक्लेयर करने से पहले उन्हें कुछ मूल्य असाइन किया जाता है जो उनके डिफाइनेशन में उपयोग किए जाने वाले उनके मानों को निर्धारित करता है।
यहाँ एक उदाहरण दिया गया है:
#include <stdio.h>
// यह ग्लोबल वेरिएबल है जिसे प्रोग्राम के सभी फंक्शन द्वारा उपयोग किया जा सकता है
int g = 10;
void func(){
// g ग्लोबल वेरिएबल है जो इस फंक्शन में भी उपलब्ध है
printf("Value of g in func() = %d\n", g);
}
int main(){
// यहाँ भी g ग्लोबल वेरिएबल है जो main() फंक्शन में भी उपलब्ध है
printf("Value of g in main() = %d\n", g);
// यहाँ g की मान बदल दी गई है
g = 20;
func();
// फिर से g की मान बदल दी गई है
g = 30;
printf("Value of g in main() = %d\n", g);
return 0;
}
इस उदाहरण में, `g` एक ग्लोबल वेरिएबल है जिसे `main()` फंक्शन और `func()` फंक्शन दोनों उपयोग करते हैं। `g` की मूल्य `main()` फंक्शन के बाहर निर्धारित की गई है, इसलिए यह `func()` फंक्शन में भी उपलब्ध है। जब `g` की मूल्य `main()` फंक्शन में बदलती है, तो यह `func()` फंक्शन में भी दिखाई देता है।
इस तरह, ग्लोबल वेरिएबल्स पूरे प्रोग्राम में उपयोग किए जाते हैं और उन्हें प्रोग्राम के किसी भी स्थान से एक ही नाम से डिफाइन किया जाता है।
फॉर्मल (Formal) वेरिएबल - जब आप एक फ़ंक्शन में एक आर्गुमेंट या पैरामीटर के रूप में वेरिएबल का उपयोग करते हैं, तो उसे फॉर्मल वेरिएबल कहा जाता है। फॉर्मल वेरिएबल सामान्यतः फ़ंक्शन में उपयोग किए जाने वाले वेरिएबल होते हैं जो फ़ंक्शन के उपयोगकर्ता द्वारा फ़ंक्शन को कॉल करते समय पास किए जाते हैं। फॉर्मल वेरिएबल लोकल वेरिएबल के समान तरीके से काम करते हैं और सिर्फ उस फ़ंक्शन में ही उपलब्ध होते हैं जिसमें उन्हें डिक्लेयर किया गया है। इसके अलावा, जब फ़ंक्शन को कॉल किया जाता है, तब फॉर्मल वेरिएबल के मान असली वेरिएबल के मान से अलग होते हैं।
- फॉर्मल वेरिएबल फ़ंक्शन के लिए पैरामीटर के रूप में उपयोग किए जाते हैं ताकि उपयोगकर्ता द्वारा फ़ंक्शन को कॉल करने पर उन्हें एक वैल्यू पास किया जा सके।
- फॉर्मल वेरिएबल्स फ़ंक्शन में उपयोग किए जाने वाले वेरिएबल्स होते हैं जो फ़ंक्शन के उपयोगकर्ता द्वारा फ़ंक्शन को कॉल करते समय पास किए जाते हैं। इसे फ़ॉर्मल वेरिएबल कहा जाता है क्योंकि यह फ़ंक्शन के साथ एक फ़ॉर्मल पैरामीटर के रूप में पास किया जाता है।
उदाहरण
C भाषा में formal variables फंक्शन में घोषित होते हैं। ये वेरिएबल्स फंक्शन की पैरामीटर्स होते हैं जो फंक्शन की दृष्टि से उनकी मानदंडों को निर्धारित करते हैं। जब एक फंक्शन को कॉल किया जाता है, तो पैरामीटर वेरिएबल्स की मान मूल वेरिएबल की मान से भिन्न हो सकती है।
यहां एक उदाहरण दिया गया है जिसमें swap फंक्शन को कॉल किया जाता है जिसमें दो मूल वेरिएबल्स a और b की मान को बदलने के लिए पैरामीटर वेरिएबल्स x और y का उपयोग किया जाता है।
#include <stdio.h>
void swap(int *x, int *y){
int temp;
temp = *x; /* temp को x की मान से भरा जाता है */
*x = *y; /* x की मान y की मान से भरी जाती है */
*y = temp; /* y की मान temp से भरी जाती है */
return;
}
int main(){
int a = 100;
int b = 200;
printf("Before swap, value of a : %d\n", a );
printf("Before swap, value of b : %d\n", b );
/* swap को कॉल किया जाता है जिसमें a और b की मान बदल जाती है */
swap(&a, &b);
printf("After swap, value of a : %d\n", a );
printf("After swap, value of b : %d\n", b );
return 0;
}
इस उदाहरण में, swap फंक्शन के दो पैरामीटर वेरिएबल्स x और y हैं जो मूल एक function के formal parameters उस function के वेरिएबल होते हैं जो function की definition में दिए जाते हैं। ये वेरिएबल उस function में केवल उसी ब्लॉक में इस्तेमाल होते हैं जिसमें उन्हें डिफ़ाइन किया गया हो। ये अन्य वेरिएबल्स के साथ मिश्रित नहीं हो सकते हैं जिन्हें function के बाहर डिफ़ाइन किया गया है।
उदाहरण के लिए, निम्नलिखित code snippet में, function add_numbers() के formal parameters x और y हैं। ये वेरिएबल्स function की definition में दिए जाते हैं। जब function को call किया जाता है, वेरिएबल्स a और b के values इन formal parameters में passed किए जाते हैं।
#include <stdio.h>
int add_numbers(int x, int y) {
int sum = x + y;
return sum;
}
int main() {
int a = 5;
int b = 10;
int result = add_numbers(a, b);
printf("The sum of %d and %d is %d\n", a, b, result);
return 0;
}
यहां, add_numbers() के formal parameters x और y उसी function के ब्लॉक में उपलब्ध होते हैं और उन्हें sum वेरिएबल के रूप में इस्तेमाल किया जाता है। a और b वेरिएबल्स को add_numbers() को passed किया जाता है, लेकिन वे function के बाहर के ब्लॉक में उपलब्ध नहीं होते हैं।
लोकल, ग्लोबल और फॉर्मल वेरिएबल को initialize करना
C भाषा में, लोकल और ग्लोबल वेरिएबल को निम्नलिखित तरीकों से initialize किया जा सकता है:
लोकल वेरिएबल वेरिएबल कैसे initialize करना
a. वेरिएबल की घोषणा के समय: आप लोकल वेरिएबल को घोषणा के समय initialize कर सकते हैं। उदाहरण के लिए:
int func() {
int x = 10; // लोकल वेरिएबल 'x' को मान 10 से initialize किया गया है।
}
b. कोड ब्लॉक के बाद: आप लोकल वेरिएबल को कोड ब्लॉक के बाद, लेकिन इससे पहले initialize कर सकते हैं। उदाहरण के लिए:
int func() {
int x; // लोकल वेरिएबल 'x' की घोषणा की गई है।
x = 10; // लोकल वेरिएबल 'x' को मान 10 से initialize किया गया है।
}
ग्लोबल वेरिएबल कैसे initialize करना
a. वेरिएबल की घोषणा के समय: आप ग्लोबल वेरिएबल को घोषणा के समय initialize कर सकते हैं। उदाहरण के लिए:
int x = 10; // ग्लोबल वेरिएबल 'x' को मान 10 से initialize किया गया है।
b. एक initialization function का उपयोग करके: आप एक function का उपयोग करके ग्लोबल वेरिएबल को initialize कर सकते हैं जो वापस लौटने वाले मान को निर्धारित करता है। उदाहरण के लिए:
int getValue() {
return 10;
}
int x = getValue(); // initialize global variable 'x' with value returned by getValue() function
यह ध्यान देने योग्य है कि यदि एक स्थानीय चर स्पष्ट रूप से प्रारंभ नहीं किया गया है, तो इसका मान अपरिभाषित है और इसमें स्मृति से कोई यादृच्छिक मान हो सकता है। दूसरी ओर, यदि कोई वैश्विक चर स्पष्ट रूप से प्रारंभ नहीं किया गया है, तो यह स्वचालित रूप से 0 पर प्रारंभ हो जाता है।
फॉर्मल वेरिएबल को initialize करना
फॉर्मल वेरिएबल को फ़ंक्शन के बॉडी में डिक्लेयर किया जाता है। जब फ़ंक्शन को कॉल किया जाता है, तो फॉर्मल पैरामीटर की मान फूंक्शन के साथ भेजी जाती है। यदि फॉर्मल पैरामीटर initialize नहीं किया गया होता है तो उसकी default मान 0 होती है। उदाहरण के लिए:
#include <stdio.h>
void printNum(int num) {
printf("The number is %d\n", num);
}
int main() {
int x = 42;
printNum(x); // output: The number is 42
return 0;
}
इस उदाहरण में, printNum() फ़ंक्शन का फॉर्मल पैरामीटर num है, जिसे x से initialize किया जाता है जब printNum() को कॉल किया जाता है। num की मान printNum() के बॉडी में उपयोग किए जाने से पहले initialize हो जाती है।
फॉर्मल वेरिएबल को फ़ंक्शन के बाहर से initialize करना संभव नहीं है, क्योंकि वे सीमित scope के अंदर होते हैं और उनके साथ काम करने के लिए उन्हें सीधे फ़ंक्शन के साथ connect किया जाना चाहिए।
लोकल, ग्लोबल और फॉर्मल वेरिएबल में अंतर
C भाषा में, लोकल, ग्लोबल और formal वेरिएबल होते हैं जो अपने स्कोप के अनुसार संबंधित होते हैं।
लोकल वेरिएबल उन वेरिएबल्स को कहते हैं जो किसी फंक्शन में डिक्लेयर किए जाते हैं और फंक्शन के बाहर इस्तेमाल नहीं किए जाते हैं। लोकल वेरिएबल केवल उन ब्लॉक के अंदर ही उपलब्ध होते हैं जहां वे डिक्लेयर किए गए हैं। ये वेरिएबल्स फंक्शन के विभिन्न कॉल के दौरान स्थानांतरित नहीं होते हैं जिससे ये वेरिएबल्स फंक्शन में सुरक्षित रहते हैं।
ग्लोबल वेरिएबल वह वेरिएबल होते हैं जो प्रोग्राम के बाहर डिक्लेयर किए जाते हैं। इन वेरिएबल्स को प्रोग्राम के किसी भी भाग में इस्तेमाल किया जा सकता है। ग्लोबल वेरिएबल्स को अपने नाम के साथ पूरे प्रोग्राम में एक बार ही डिक्लेयर किया जाता है। इन वेरिएबल्स को कोई फंक्शन या ब्लॉक नहीं लगाया जाता है।
इसके अलावा, लोकल और formal वेरिएबल के अंतर में भी अंतर होता है। एक formal पैरामीटर फ़ंक्शन के विभिन्न कॉल के दौरान उस फ़ंक्शन के लिए एक नया instance बनाता है, जो उस कॉल में उपयोग करने के लिए उपलब्ध होता है। जब तक उस कॉल का execution चलता है, तब तक यह instance active रहता है। जब तक फ़ंक्शन के execution का पूरा execution कंप्लीट नहीं होता है, तब तक इसका उपयोग किया जा सकता है। फ़ंक्शन के execution के बाद, उस instance को मेमोरी से हटा दिया जाता है।
इसी तरह, ग्लोबल और लोकल वेरिएबल के अंतर में भी अंतर होता है। ग्लोबल वेरिएबल प्रोग्राम के शुरुआत में declare किए जाते हैं और प्रोग्राम के अंत तक active रहते हैं। लोकल वेरिएबल प्रोग्राम के लिए एक नया instance बनाते हैं, जो उस block में उपलब्ध होता है जिसमें वे declare किए गए हैं। जब तक उस block का execution चलता है, तब तक यह instance active रहता है। जब तक block का execution कंप्लीट नहीं होता है, तब तक उसका उपयोग किया जा सकता है। ब्लॉक के execution के बाद, उस instance को मेमोरी से हटा दिय
तीनो वेरिएबल में अंतर का उदाहरण
एक उदाहरण के माध्यम से इन तीनों प्रकार के वेरिएबल के अंतर को समझ सकते है।
ग्लोबल वेरिएबल:
#include <stdio.h>
int global_var = 10; //ग्लोबल वेरिएबल डिक्लेयर किया गया है
void print_global_var() {
printf("Value of global_var inside function: %d\n", global_var); //ग्लोबल वेरिएबल का मान प्रिंट किया गया है
}
int main() {
printf("Value of global_var outside function: %d\n", global_var); //ग्लोबल वेरिएबल का मान प्रिंट किया गया है
print_global_var(); //ग्लोबल वेरिएबल को फंक्शन में पास किया गया है
return 0;
}
लोकल वेरिएबल:
#include <stdio.h>
void print_local_var() {
int local_var = 5; //लोकल वेरिएबल डिक्लेयर किया गया है
printf("Value of local_var inside function: %d\n", local_var); //लोकल वेरिएबल का मान प्रिंट किया गया है
}
int main() {
print_local_var(); //लोकल वेरिएबल को फंक्शन में पास किया नहीं गया है
return 0;
}
फॉर्मल वेरिएबल:
#include <stdio.h>
void print_formal_var(int formal_var) { //फॉर्मल वेरिएबल डिक्लेयर किया गया है
printf("Value of formal_var inside function: %d\n", formal_var); //फॉर्मल वेरिएबल का मान प्रिंट किया गया है
}
int main() {
int main_var = 10; //मेन वेरिएबल डिक्लेयर किया गया है
print_formal_var(main_var); //मेन वेरिएबल को फंक्शन में पास किया गया है
return 0;
}