जब हम C या C++ में एक वेरिएबल घोषित करते हैं लेकिन उसे आरंभ नहीं करते, तो उसमें **अनिश्चित मान** (इनडिटरमिनेट वैल्यू) होता है - जिसे अक्सर "कचरा मान" कहा जाता है।
महत्वपूर्ण नियम
- स्थानीय/ऑटोमैटिक वेरिएबल्स: अनारंभित = अनिश्चित मान (कचरा)
- स्थैतिक/वैश्विक वेरिएबल्स: स्वचालित रूप से शून्य-आरंभित
- डायनामिक आवंटन (
malloc): अनारंभित (कचरा) calloc/new(): शून्य-आरंभित
C++ उदाहरण
#include <iostream>
using namespace std;
int main() {
char char_var;
float float_var;
int int_var;
double double_var;
long long_var;
cout << "char: " << (int)char_var << endl;
cout << "float: " << float_var << endl;
cout << "int: " << int_var << endl;
cout << "double: " << double_var << endl;
cout << "long: " << long_var << endl;
return 0;
}
विभिन्न कंपाइलर्स/पर्यावरण पर आउटपुट
Cpp.sh (ऑनलाइन)
0 0 0 0 0
Online GDB
5.88054e-39 0 6.95297e-310 0
स्थानीय सिस्टम (सामान्य)
9.73438e-039 4309744 1.15685e-306 -53505136
क्यों कंपाइलर डिफ़ॉल्ट मान से आरंभ नहीं करता?
उत्तर: स्टैक वेरिएबल को आरंभ करने का ओवरहेड निष्पादन गति को बाधित करता है। C/C++ "आप जो उपयोग नहीं करते उसके लिए भुगतान न करें" दर्शन का पालन करते हैं। इसलिए ये वेरिएबल्स अनिश्चित मान रख सकते हैं।
सर्वोत्तम अभ्यास
- हमेशा आरंभ करें:
int x = 0;,float f = 0.0f;,char c = '\0'; - घोषणा के समय आरंभीकरण:
int x{0};(C++11 यूनिफॉर्म आरंभीकरण) - कंपाइलर चेतावनियां सक्षम करें:
-Wall -Wextra -Wuninitialized(GCC/Clang) - स्टैटिक एनालिसिस टूल्स उपयोग करें (Cppcheck, Clang Static Analyzer)
आरंभीकरण के प्रकार
| प्रकार | सिंटैक्स | नोट्स |
|---|---|---|
| डिफ़ॉल्ट | int x; | स्थानीय: अनिश्चित; स्थैतिक: 0 |
| मान आरंभीकरण | int x = 0; | क्लासिक C शैली |
| यूनिफॉर्म (C++11) | int x{0}; | नैरोइंग रूपांतरण रोकता है |
| कॉन्स्ट्रक्टर | std::string s; | डिफ़ॉल्ट कॉन्स्ट्रक्टर कॉल करता है |
| एग्रीगेट | int arr[5] = {0}; | सभी तत्व 0 |
निष्कर्ष
कभी भी अनारंभित वेरिएबल्स के मान पर भरोसा न करें। यह अनिर्दिष्ट व्यवहार (Undefined Behavior) है और पोर्टेबल, विश्वसनीय कोड के लिए हमेशा स्पष्ट आरंभीकरण करें।