मुझे लगता है कि दूसरे उत्तरों से कुछ छूट रहा है।
हां, p[i]
परिभाषा के समतुल्य है *(p+i)
, जो (क्योंकि इसके अलावा कम्यूटेटिव है) बराबर है *(i+p)
, जो (फिर से, []
ऑपरेटर की परिभाषा के अनुसार ) के बराबर है i[p]
।
(और array[i]
, सरणी नाम को संक्षेप में एक सूचक को सरणी के पहले तत्व में बदल दिया जाता है।)
लेकिन इसके अलावा इस मामले में स्पष्टता की स्पष्टता नहीं है।
जब दोनों ऑपरेंड एक ही प्रकार के होते हैं, या अलग-अलग न्यूमेरिक प्रकार के होते हैं, जिन्हें एक सामान्य प्रकार में बढ़ावा दिया जाता है, तो कम्यूटिविटी बहुत मायने रखती है x + y == y + x
:।
लेकिन इस मामले में हम विशेष रूप से पॉइंटर अंकगणित के बारे में बात कर रहे हैं, जहां एक ऑपरेंड एक पॉइंटर है और दूसरा एक पूर्णांक है। (पूर्णांक + पूर्णांक एक अलग ऑपरेशन है, और सूचक + सूचक बकवास है।)
+
ऑपरेटर के सी मानक विवरण ( N1570 6.5.6) कहते हैं:
इसके अलावा, या तो दोनों ऑपरेंड में अंकगणित प्रकार होंगे, या एक ऑपरेंड पूर्ण ऑब्जेक्ट प्रकार के लिए एक संकेतक होगा और दूसरे में पूर्णांक प्रकार होगा।
यह आसानी से कहा जा सकता है:
इसके अलावा, या तो दोनों ऑपरेंड में अंकगणित प्रकार होंगे, या बाएं
ऑपरेंड एक पूर्ण ऑब्जेक्ट प्रकार के लिए एक संकेतक होगा और सही ऑपरेंड
में पूर्णांक प्रकार होगा।
जिस स्थिति में दोनों i + p
और i[p]
अवैध होगा।
C ++ शब्दों में, हमारे पास वास्तव में ओवरलोड +
ऑपरेटरों के दो सेट हैं , जिन्हें निम्न रूप से वर्णित किया जा सकता है:
pointer operator+(pointer p, integer i);
तथा
pointer operator+(integer i, pointer p);
जिनमें से केवल पहला वास्तव में आवश्यक है।
तो यह इस तरह से क्यों है?
C ++ को यह परिभाषा C से विरासत में मिली, जो इसे B से मिली (सरणी अनुक्रमण की कम्यूटिटी का स्पष्ट रूप से 1972 उपयोगकर्ताओं के संदर्भ B में उल्लेख किया गया है ), जो इसे BCPL (मैन्युअल दिनांक 1967) से मिला , जो इसे अच्छी तरह से प्राप्त कर सकता है। पहले की भाषाएँ (CPL? Algol?)।
तो यह विचार है कि सरणी अनुक्रमण को जोड़ के रूप में परिभाषित किया गया है, और इसके अलावा, यहां तक कि एक सूचक और एक पूर्णांक, कम्यूटेटिव है, सी के पूर्वजों की भाषाओं में कई दशक पीछे चला जाता है।
उन भाषाओं को आधुनिक सी की तुलना में बहुत कम टाइप किया गया था। विशेष रूप से, संकेत और पूर्णांक के बीच के अंतर को अक्सर नजरअंदाज कर दिया जाता था। (प्रारंभिक सी प्रोग्रामर कभी-कभी संकेतित शब्दों के रूप में अहस्ताक्षरित पूर्णांक का उपयोग करते थे, इससे पहले कि unsigned
भाषा को जोड़ा गया था।) इसलिए गैर-कम्यूटेटिव बनाने का विचार है क्योंकि ऑपरेंड विभिन्न प्रकार के होते हैं जो शायद उन भाषाओं के डिजाइनरों के लिए नहीं होते थे। यदि कोई उपयोगकर्ता दो "चीजें" जोड़ना चाहता था, चाहे वे "चीजें" पूर्णांक, संकेत या कुछ और हों, तो इसे रोकने के लिए यह भाषा पर निर्भर नहीं था।
और वर्षों में, उस नियम में कोई भी परिवर्तन मौजूदा कोड को तोड़ देता (हालांकि 1989 एएनएसआई सी मानक एक अच्छा अवसर हो सकता था)।
सी और / या सी ++ को बदलने के लिए बाईं ओर पॉइंटर लगाने की आवश्यकता होती है और दाएं पर पूर्णांक कुछ मौजूदा कोड को तोड़ सकता है, लेकिन वास्तविक अभिव्यंजक शक्ति का कोई नुकसान नहीं होगा।
तो अब हमारे पास arr[3]
और 3[arr]
बिल्कुल एक ही अर्थ है, हालांकि बाद वाला फॉर्म IOCCC के बाहर कभी दिखाई नहीं देना चाहिए ।