2012-01-18 16 views
33

संभव डुप्लिकेट:
In C arrays why is this true? a[5] == 5[a]यह क्यों काम करता है? विसंगत सरणी पहुँच

मेरा एक दोस्त पहली बार के लिए C++ सीख रहा है, और मुझे इस टुकड़ा भेजा:

int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 }; 
char bar[] = " abcdefghijklmnopqrstuvwxyz-,.!?-_"; 
for (int i = 0; i < 10; ++i) { 
    std::cout << foo[i][bar]; 
} 

एक पर नज़र, मैंने उससे कहा कि यह काम नहीं करेगा - मैंने सोचा कि यह संकलित नहीं होगा, या कम से कम एक उल्लंघन उल्लंघन का परिणाम होगा, क्योंकि foo एक नहीं है द्वि-आयामी सरणी, जिसमें उन्होंने जवाब दिया कि यह करता है।

मैंने अपने लिए प्रयास किया, और मेरे आश्चर्य की बात है, स्निपेट पूरी तरह से ठीक चला गया। सवाल यह है: क्यों?

तर्क, सामान्य ज्ञान और अच्छी प्रथा के अनुसार, वाक्यविन्यास bar[foo[i]] होना चाहिए।

मुझे यह स्वीकार करने में शर्म आती है कि मुझे नहीं पता कि क्या हो रहा है। इस मामले में foo[i][bar] वैध वाक्यविन्यास क्या बनाता है?

+16

यह एक सटीक डुप्लिकेट नहीं है, और उत्तर बहुत दिलचस्प है। दोनों प्रश्नों के लिए मूल कारण समान है, लेकिन यह StackOverflow पर सैकड़ों प्रश्नों के लिए सच है। –

+1

बीटीडब्लू: मैं केवल आउटपुट के साथ सहमत हूं अगर मैं इस तरह की चीजें कर रहा हूं ... – stefaanv

+0

अजीब बात यह है कि अगर कोई लिंक किए गए प्रश्न को पढ़ता है तो यह वास्तव में समझ में आता है, फिर भी जब भी आप ' टी समझ में नहीं आता; अजीब हिस्सा केवल "यह काम कैसे करता है" से बदलता है "उन्होंने यह काम क्यों किया"। –

उत्तर

35

साधारण शब्दों में, सी में एक सरणी तत्व की एक्सेस (और सी ++ में, जब [] ओवरलोड न हो जाए) इस प्रकार है:

x[i] = *(x + i) 

तो, यह और गणित का एक छोटा सा के साथ। ..

foo[i][bar] 
= (foo[i])[bar] 
= (*(foo + i))[bar] 
= *((*(foo + i)) + bar) 
= *(bar + (*(foo + i))) 
= bar[*(foo + i)] 
= bar[foo[i]] 

हालांकि इस "तथ्य" का उपयोग न करें। जैसा कि आपने देखा है, यह कोड को पढ़ने योग्य बनाता है, और अपठनीय कोड अनजान है।

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