2015-12-14 3 views
10

मैं इस ऑनलाइन में आया और सोच रहा था कि कोई इसे समझाने में सक्षम हो सकता है या कम से कम मुझे यह बता सकता है कि यह क्या हो सकता है ताकि मैं कम से कम जान सकूं कि मैं क्या कर रहा हूं के लिये।सी ++ रिवर्सिंग इंडेक्सर और सरणी का नाम

int main() 
{ 
    int myarray[4] = {0, 100, 200, 300}; 
    2[myarray] = -999; //why does this work? what is this called? 

    for (int i = 0; i < 4; i++) 
     cout << myarray[i] << endl; 
} 

उत्पादन 0 है, 100, -999, 300

मैं इसे भाग गया है। मुझे पता है यह काम करता है लेकिन क्यों? इसे क्या कहा जाता है?

+0

इसे दिन में वापस के एंड आर सी – YSC

उत्तर

8

कारण यह है क्योंकि arr[n] == *(arr + n) है।

हालांकि, क्योंकि अतिरिक्त कम्यूटिव है, *(arr + n) == *(n + arr)। इस प्रकार, *(n + arr) == n[arr] == *(arr + n) == arr[n]

यह उल्लेखनीय हो सकता है कि *(arr + n) अभी भी थोड़ा भ्रामक है। असेंबली में इसका अर्थ है *(arr + (n * s)) जहां ssizeof arr[0] है, लेकिन यह कवर के तहत है इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

+0

के साथ बेवकूफ रेट्रो-संगतता कहा जाता है, जब मैंने स्वयं सी सी सीखा, तो शायद ही कभी उल्लेख किया गया था कि * '' 'आकार का सरणी है [0]' *, अच्छा आपने इसे जोड़ा में :) – nonsensation

3

मुझे नहीं लगता कि पॉइंटर अंकगणित के नियमों का यह विशेष [ab-] उपयोग किसी विशेष नाम का है। यह सी और सी ++ में पॉइंटर अंकगणितीय परिभाषित तरीके से बाहर गिर रहा है। दो भाषा मानकों में से कोई भी सबस्क्रिप्ट और सूचक के उलट को रोकने के लिए कोई विशेष प्रयास नहीं करता है। उदाहरण के लिए, प्रासंगिक सी ++ नियम 5.2.1 [expr.sub] पैराग्राफ 1:

स्क्वायर ब्रैकेट्स में एक अभिव्यक्ति के बाद एक पोस्टफिक्स अभिव्यक्ति एक पोस्टफिक्स अभिव्यक्ति है। अभिव्यक्तियों में से एक में "टी की सरणी" या "टी से पॉइंटर" प्रकार होगा और दूसरे में अनसुलझा गणना या अभिन्न प्रकार होगा। परिणाम "टी" प्रकार का है। "टी" टाइप पूरी तरह से परिभाषित ऑब्जेक्ट प्रकार होगा। अभिव्यक्ति ई 1 [ई 2] समान (परिभाषा के अनुसार) * ((ई 1) + (ई 2)) [नोट: एरे के विवरण के लिए * और + और 8.3.4 के विवरण के लिए 5.3 और 5.7 देखें। - नोट नोट], सिवाय इसके कि एक सरणी ऑपरेंड के मामले में, परिणाम एक लवल्यू है यदि वह ऑपरेंड अन्यथा एक लालसा और एक xvalue है।

यह काम "सी ++ 5.2.1" या "सी ++ [expr.sub]" लेकिन उलट के उपयोग नहीं है कि भ्रामक लोग हैं, जो काफी लंबे समय से नहीं लग रही है परे बड़ी है देखने के लिए कर सकते हैं सी या सी ++ पर।

संबंधित मुद्दे