2013-01-04 17 views
13

मुझे पता है क्यों? इस साइट के लिए एक बुरा सवाल है, क्योंकि हम नहीं जानते हैं। हालांकि मेरा मतलब यह पूछने के लिए एक बोलचाल प्रतिस्थापन के रूप में है, कुछ संभावित कारण क्या हैं?क्यों नहीं है -> [] सी ++ में एक ऑपरेटर? (dereferenced सरणी पॉइंटर्स के लिए एक सबस्क्रिप्ट ऑपरेटर)

मुझे लगने लेखन, स्वाभाविक रूप से,

foo->[i]; 

और जानने के लिए कि यह काम नहीं किया हैरान किया जा रहा है। मैं लिखने के लिए होती:

(*foo)[i]; 

मुझे यकीन है कि सबसे अधिक देखने को पहले से ही मैं क्या मतलब है, लेकिन स्पष्ट होना, मैंने सोचा

bar.subscript(i); 
foo->subscript(i); 

के अनुरूप होगा हूँ

bar.operator[](i); 
foo->operator[](i); 

लेकिन यह मामला प्रतीत नहीं होता है। क्यूं कर? मुझे यकीन है कि मुझे कुछ गलत तरीके से देखना चाहिए, लेकिन मैं यह नहीं समझ सकता कि क्या। मुझे बहुत कम सिद्धांत पता है, इसलिए एक व्यक्ति की व्याख्या की सराहना की जाएगी।

यदि मेरे समानता में कोई स्पष्ट त्रुटि नहीं है, तो भाषा के डिजाइनरों ने ऑपरेटर को छोड़ने के कुछ संभावित कारण क्या हैं? क्या यह संदिग्ध है? (? यदि हां, तो क्या mistakable होने के रूप में)


मैं, एक संपादन में कुछ टिप्पणियाँ लाने के लिए के अनुसार @ क्रिस की सिफारिश के रूप में मैं के रूप में स्पष्ट नहीं किया गया चाहूँगा के रूप में मैं किया जाना चाहिए था:

ओपी ऑपरेटर -> [], दोनों का संयोजन प्रस्तावित कर रहा है।
- क्रिस
वह पूछ रहा है कि वह जो चीज चाहता है वह मौजूद नहीं है, क्यों वह जिस कोड को लिखने की कोशिश कर रहा है वह काम नहीं करता है।
- मैथ्यू 'कोगवील' ऑरलैंडो
+0

एक दिलचस्प सवाल यह है कि "विश्लेषण करना मुश्किल होगा"। मुझे उस सवाल का जवाब नहीं पता है। – Yakk

+1

@Yakk, मुझे प्रभाव में अधिकतम मंच के साथ संदेह है। मैं उस पर टिप्पणी करने वाला था। – chris

+2

क्योंकि उस समय किसी ने इसके बारे में सोचा नहीं था और किसी ने अभी तक इसे मानक बनाने के लिए पर्याप्त देखभाल नहीं की है। 99% "एक्स अच्छा लगता है, सी ++ में एक्स क्यों नहीं है" प्रश्नों के पीछे यही कारण है। यह विशेष रूप से इस तरह के प्रश्नों के बारे में सच है: लोगों को '(* x) लिखने के लिए कहना बहुत आसान है। [I] 'मानक टेक्स्ट बदलने के सभी काम करने के बजाय' x -> [i] 'के बजाय , इसका परीक्षण, सुनिश्चित करें कि कोई भयानक निरीक्षण नहीं है, आदि ... – GManNickG

उत्तर

3

भाषा के डिजाइनरों ने ऑपरेटर को छोड़ने के कुछ संभावित कारण क्या हैं?

1: किसी ने इसे प्रस्तावित नहीं किया। यदि यह प्रस्तावित नहीं होता है, तो यह भाषा में नहीं आता है।

2: यह गलत लगता है। operator-> एक सूचक वापस कर सकता है, लेकिन भाषा में का उपयोग करें "इस सूचक का संदर्भ लें और एक सदस्य का उपयोग करें"। -> के साथ भाषा यही करेगी। तो जब कोई ->[] देखता है, तो यह गलत लगता है। हर दूसरे मामले में -> के दाईं ओर की बात सदस्य पहचानकर्ता का कुछ रूप है।

3: क्योंकि इस तरह के कुछ नाबालिग बदलने की तुलना में भाषा के साथ कहीं और महत्वपूर्ण चीजें हैं।

+4

'foo -> (bar) = baz -> [snaf]' - ओओ, और 'foo -> ++ 'को मत भूलना! ओह, और 'foo -> [बार] -> [snaf] -> [meh] = 7' - सिंटैक्स के बारे में सोचें जो हम इससे प्राप्त कर सकते हैं! – Yakk

+0

आह, ठीक है। नहीं, मैं मानता हूं, शायद यह बनाने का प्रस्ताव नहीं था, बनाने के लायक बदलाव में बहुत कम था। मैं और पूछ रहा था क्योंकि मैंने सोचा था कि मेरे तर्क में कुछ गड़बड़ है, न केवल यह कि मानव/व्यक्तिपरक कारक था। धन्यवाद। –

+1

@Yakk - आह, असल में, मुझे लगता है कि आपके उदाहरणों ने एक महान कारण पर प्रकाश डाला है कि यह क्यों छोड़ा जा सकता है! मुझे अन्य ऑपरेटरों की हत्या का एहसास नहीं हुआ जो मुझे जो कह रहा है उसके अनुरूप बने रहने के लिए पेश किया जाना चाहिए। –

4

ऑपरेटर> के अधिकार के एक सदस्य के नाम होना चाहिए। एक स्पष्ट ऑपरेटरXYZ मुझे लगता है कि सदस्य के नाम के रूप में गिना जाता है, इसलिए foo-> ऑपरेटर [] की अनुमति है। हालांकि, जैसे एक यादृच्छिक टोकन [] किसी सदस्य के नाम के रूप में नहीं गिना जाता है, इसलिए foo -> [i] की अनुमति नहीं है।

+2

यही कारण है कि इसे 'ऑपरेटर -> [] (foo, i); के बराबर बनाया जाएगा। – chris

+0

यदि यह उत्तर है, तो मुझे यह समझ में नहीं आता है, फिर भी ... –

+1

@ acheong87, यह उत्तर इस आधार पर है कि '->' और '[]' दो अलग-अलग ऑपरेटर हैं। जैसा कि आप पूछते हैं, उन्हें एक में विलय करना, इसे ठीक काम करने का कारण बनता है। – chris

1

मुझे लगता है कि कारण यह है कि सी ++ में एक महत्वपूर्ण मौका है कि आप पॉइंटर्स-टू-सी-एरे के बजाय vector (या array सी ++ 1 में) का उपयोग करेंगे। सी ++ - केंद्रित समाधानों में ऐसे ऑपरेटर की कोई आवश्यकता नहीं है, इसलिए शायद इसे कम से कम लाभ प्रदान करते हुए कंपाइलर के लिए अतिरिक्त काम समझा जाता था।

यदि आपको 2 डी सरणी की आवश्यकता है तो foo[0][i] पहले ही सी-एरे के साथ काम करता है।

+0

हू? मैं इस ऑपरेटर के लिए किसी भी समय एक ऑपरेटर [] 'के साथ किसी पॉइंटर या इटरेटर के लिए उपयोग देख सकता हूं, जो सी ++ की तुलना में सी ++ में अधिक संभावना है (हालांकि समग्र रूप से बहुत आम नहीं है)। – delnan

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