इन्क्रीमेंट ऑपरेटर्स
| ऑपरेटर | नाम | व्यवहार | समतुल्य |
|---|---|---|---|
++a | प्री-इन्क्रीमेंट | पहले बढ़ाएं, फिर मान उपयोग करें | a = a + 1; use a; |
a++ | पोस्ट-इन्क्रीमेंट | पहले मान उपयोग करें, फिर बढ़ाएं | use a; a = a + 1; |
सरणी तत्वों के साथ
int arr[5] = {1, 2, 3, 25, 7};
a = ++arr[1]; // arr[1] पहले 2→3 होता है, फिर a = 3
b = arr[1]++; // b = 3 (वर्तमान), फिर arr[1] 3→4 होता है
c = arr[a++]; // a=3 उपयोग → arr[3]=25, फिर a=4
उदाहरण 1
#include <stdio.h>
int main() {
int a, b, c;
int arr[5] = {1, 2, 3, 25, 7};
a = ++arr[1]; // arr[1]=2→3, a=3
b = arr[1]++; // b=3, arr[1]=3→4
c = arr[a++]; // a=3 उपयोग → arr[3]=25, फिर a=4
printf("%d--%d--%d\n", a, b, c);
return 0;
}
आउटपुट
4--3--25
चरण-दर-चरण व्याख्या
प्रारंभिक: arr = [1, 2, 3, 25, 7] 1. a = ++arr[1] arr[1] = 2 + 1 = 3 a = 3 arr = [1, 3, 3, 25, 7] 2. b = arr[1]++ b = arr[1] = 3 arr[1] = 3 + 1 = 4 arr = [1, 4, 3, 25, 7] 3. c = arr[a++] a वर्तमान में 3 है arr[3] = 25 → c = 25 a = 3 + 1 = 4 अंतिम: a=4, b=3, c=25, arr=[1,4,3,25,7]
उदाहरण 2: अलग सूचकांक
#include <stdio.h>
int main() {
int a, b, c;
int arr[5] = {1, 2, 3, 25, 7};
a = ++arr[3]; // arr[3]=25→26, a=26
b = arr[3]++; // b=26, arr[3]=26→27
c = arr[a++]; // a=26 → arr[26] आउट ऑफ बाउंड्स! UB
printf("%d--%d--%d\n", a, b, c);
return 0;
}
आउटपुट
27--26--0 (या क्रैश/कचरा - अनिर्धारित व्यवहार)
सावधानियाँ और सर्वोत्तम अभ्यास
❌ बचें: जटिल अभिव्यक्तियों में मिश्रित इन्क्रीमेंट
// पढ़ने में कठिन, बग-प्रवण
x = arr[i++] + arr[++j] * arr[k--];
✅ बेहतर: अलग स्टेटमेंट्स
// स्पष्ट, डीबग करने योग्य
arr[i]++;
int x = arr[i];
j++;
int y = arr[j];
k--;
int z = arr[k];
result = x + y * z;
सीक्वेंस पॉइंट्स (Sequence Points)
C में, एक पूर्ण अभिव्यक्ति (; पर समाप्त) के अंत में साइड इफेक्ट्स पूरे होने की गारंटी होती है। एक ही अभिव्यक्ति में एक ही ऑब्जेक्ट को दो बार संशोधित करना UB है:
i = i++; // UB - अनिर्धारित
a[i] = i++; // UB - i दो बार संशोधित
printf("%d %d", i++, i++); // UB - आर्गुमेंट मूल्यांकन क्रम अनिर्दिष्ट