++x (प्री-इन्क्रीमेंट) और x++ (पोस्ट-इन्क्रीमेंट) दोनों वेरिएबल बढ़ाते हैं, लेकिन **वैल्यू** और **सीक्वेंस पॉइंट** व्यवहार में भिन्न हैं।
मुख्य अंतर
| पहलू | प्री-इन्क्रीमेंट (++x) | पोस्ट-इन्क्रीमेंट (x++) |
|---|---|---|
| वैल्यू | बढ़ाया गया मान | मूल मान |
| प्रभाव | तत्काल | सीक्वेंस पॉइंट पर/पहले |
| ऑपरेंड | लवैल्यू आवश्यक | लवैल्यू आवश्यक |
| प्रेसिडेंस | पोस्टफिक्स से अधिक | प्रीफिक्स से कम |
| असोसिएटिविटी | राइट-टू-लेफ्ट | लेफ्ट-टू-राइट |
उदाहरण
#include <iostream>
using namespace std;
int main() {
int x = 10, y = 10, z;
z = ++x; // x=11, z=11
cout << "++x: z=" << z << ", x=" << x << endl;
z = y++; // z=10, y=11
cout << "y++: z=" << z << ", y=" << y << endl;
// जटिल अभिव्यक्ति
int a = 5;
int b = ++a + a++; // अनडिफाइंड बिहेवियर! (C++17 से पहले)
// C++17: ++a पहले (a=6), फिर a++ (वैल्यू 6, a=7) → b = 6+6=12
return 0;
}
आउटपुट
++x: z=11, x=11 y++: z=10, y=11
अनडिफाइंड बिहेवियर चेतावनी
// खतरनाक: एक ही वेरिएबल पर मल्टीपल अनसीक्वेंस्ड साइड इफेक्ट्स
i = i++ + ++i; // UB
a[i++] = i; // UB (C++17 से पहले)
printf("%d %d", i++, i++); // UB: आर्गुमेंट इवैल्यूएशन ऑर्डर अनिर्दिष्ट
सर्वोत्तम अभ्यास
- कॉम्प्लेक्स एक्सप्रेशन्स में एक ही वेरिएबल पर मल्टीपल इन्क्रीमेंट/डिक्रीमेंट से बचें।
- स्टेटमेंट्स में अलग करें:
++x; y = x;बजायy = ++x;जब स्पष्टता चाहिए। - लूप्स में
++iप्राथमिकता दें (कॉपी नहीं बनती, हालांकि ऑप्टिमाइज़र इसे हैंडल करता है)।