बिंदु के लिए C तारांकन का उपयोग क्यों करता है? [बन्द है]


21

मैं अभी C के बारे में जान रहा हूँ।

मुझे यह अजीब लगता है कि रचनाकारों ने तारांकन चिह्न ( *) को संकेत के बजाय प्रतीक के रूप में चुना था जो वास्तव में एक संकेतक ( ) की तरह दिखता है->

यह देखते हुए कि कैसे भ्रामक और फ़ंक्शन पॉइंटर्स भ्रामक हो सकते हैं, क्या कोई ऐतिहासिक, या व्यावहारिक भी है, जो तारांकन का उपयोग करने का कारण है?


10
ध्यान दें कि ->सी भाषा में एक परिचालक ऑपरेटर के रूप में उपयोग किया जा रहा है - जब किसी संरचना में फ़ील्ड्स तक पहुँचने के लिए: struct_pointer->fieldजो कि कम है (*struct_pointer).field
amon

@ मैंन: यह केवल डेरेफेरिंग के structsलिए लागू होता है, जो मुझे अजीब लगता था। यह एक संकेतक प्रतीक है, है ना? क्यों नहीं ( <-) के लिए dereferencing? क्या मैं वास्तव में एकमात्र ऐसा हूं जो इस तरह से सोचता है?
नोब Saibot

1
इस सवाल में दो उत्कृष्ट उत्तरों को देखते हुए, भाषा डिजाइनर से सीधे एक उत्तर सहित, यह वास्तव में "राय-आधारित" के रूप में नज़दीकी को सही ठहराना कठिन है। इसलिए मैंने फिर से खोलने के लिए नामांकित किया है।
जूल्स

IMHO पास्कल शैली बेहतर है। ^का उपयोग किया जाता है और एक घुमाए गए तीर के बारे में सोचा जा सकता है और "बिंदु" के रूप में पढ़ा जा सकता है, जिसका अर्थ है ->लेकिन कम। ^integerप्रकार की घोषणा के लिए "पॉइंटर टू पूर्णांक" का var^अर्थ है , और इसका अर्थ है "स्मृति varबिंदुओं के लिए" डेरेफेरिंग के लिए। बाएं से दाएं पढ़ने पर सी की तुलना में प्रतीक की स्थिति अधिक तार्किक है, जो हमेशा टाइप नाम के बाद और चर नाम से पहले रखी जाती है। पास्कल @पता लेने के लिए भी उपयोग करता है , जो इससे बेहतर है &, क्योंकि @var"वह पता जिस पर var स्थित है"
phuclv

जवाबों:


59

बिंदु के लिए C तारांकन का उपयोग क्यों करता है?

बस - क्योंकि B ने किया।

क्योंकि मेमोरी एक रैखिक सरणी है, इसलिए इस सरणी में एक इंडेक्स के रूप में सेल में मूल्य की व्याख्या करना संभव है, और बीसीपीएल इस उद्देश्य के लिए एक ऑपरेटर की आपूर्ति करता है। मूल भाषा में यह वर्तनी थी rv, और बाद में !, जबकि बी का उपयोग करता है *। इस प्रकार, यदि pएक सेल एक अन्य सेल के (या पते के), या सूचक के सूचकांक से युक्त है *p, तो पॉइंट-इन सेल की सामग्री को संदर्भित करता है, या तो एक अभिव्यक्ति में या एक असाइनमेंट के लक्ष्य के रूप में।

से सी भाषा का विकास

बस। इस बिंदु पर, यह सवाल उतना ही निराला है कि "अजगर 3 .पद्धति का उपयोग करने के लिए क्यों कहता है? क्यों नहीं ->?" खैर ... क्योंकि पायथन 2 .एक विधि को कॉल करने के लिए उपयोग करता है।

शायद ही कभी किसी भाषा का अस्तित्व होता है। इसका प्रभाव है और यह उस चीज पर आधारित है जो पहले आई थी।


तो, बी !ने अपने पूर्ववर्ती बीसीपीएल की तरह एक सूचक को डीफ़्रॉन्डिंग करने के लिए उपयोग क्यों नहीं किया?

खैर, बीसीपीएल थोड़ा चिंतित था। के बजाय &&या ||BCPL का इस्तेमाल किया logandऔर logor। ऐसा इसलिए था क्योंकि अधिकांश कीबोर्ड में चाबियाँ या चाबियां नहीं थीं और न के बराबर वास्तव में शब्द था NEQV(देखें बीसीपीएल संदर्भ मैनुअल )।

प्रतीत होता है कि इन सभी तार्किक ऑपरेटरों के लिए लंबे शब्दों के बजाय सिंटैक्स को कसने के लिए आंशिक रूप से प्रेरित किया गया है जो प्रोग्रामर ने अक्सर किया। और इस तरह !से डीरेफेरेंस हो गया *ताकि !लॉजिकल निगेटिव इस्तेमाल किया जा सके। ध्यान दें कि अपर *ऑपरेटर और बाइनरी *ऑपरेटर (गुणन) के बीच अंतर है ।


खैर, अन्य विकल्पों के बारे में क्या पसंद है ->?

->क्षेत्र derefrences आसपास वाक्यात्मक चीनी के लिए ले जाया गया struct_pointer->fieldहै जो(*struct_pointer).field

अन्य विकल्प जैसे <-अस्पष्ट पार्सिंग बना सकते हैं। उदाहरण के लिए:

 foo <- bar

क्या यह इस प्रकार है:

(foo) <- (bar)

या

(foo) < (-bar)

एक यूनीरी ऑपरेटर बनाना जो एक बाइनरी ऑपरेटर से बना होता है और दूसरा यूनिरी ऑपरेटर को समस्याएँ होने की संभावना होती है क्योंकि दूसरा यूनिरी ऑपरेटर किसी अन्य अभिव्यक्ति के लिए उपसर्ग हो सकता है।

इसके अलावा, चीजों को एक न्यूनतम तक बार-बार टाइप करने की कोशिश करना फिर से महत्वपूर्ण है। मैं होता नफरत लिखने के लिए:

int main(int argc, char->-> argv, char->-> envp)

यह भी पढ़ना मुश्किल हो जाता है।

अन्य वर्ण संभव हो सकते हैं ( @जब तक इसका उपयोग उद्देश्य C ने इसे लागू नहीं किया था )। हालांकि फिर से, यह 'C उपयोगों के मूल में जाता है *क्योंकि B ने किया था'। B ने उपयोग क्यों नहीं किया @? खैर, बी सभी पात्रों का उपयोग नहीं किया। कोई bppप्रोग्राम नहीं था ( cpp की तुलना करें ) और अन्य वर्ण B में उपलब्ध थे (जैसे कि #बाद में cpp द्वारा उपयोग किया गया था)।

अगर मैं अनुमान लगा सकता हूं कि क्यों - इसकी वजह से जहां चाबियाँ हैं। बी पर एक मैनुअल से :

जब यह उचित लगता है, तो पते में हेरफेर की सुविधा के लिए, बी दो अपरिपक्व पते ऑपरेटर प्रदान करता है, *और &&एड्रेस ऑपरेटर है, इसलिए &xइसका पता xएक है। *अप्रत्यक्ष परिचालक है; *xइसका मतलब है "एक पते के रूप में एक्स की सामग्री का उपयोग करें।"

ध्यान दें कि &शिफ्ट -7 है और *शिफ्ट-8 है। एक-दूसरे के साथ उनकी निकटता प्रोग्रामर के लिए एक संकेत हो सकता है कि वे क्या करते हैं ... लेकिन यह केवल एक अनुमान है। किसी को केन थॉम्पसन के बारे में पूछना होगा कि वह चुनाव क्यों किया गया था।


इसलिए यह अब आपके पास है। C वह तरीका है क्योंकि B था। बी वह तरीका है क्योंकि यह बीसीपीएल से कैसे बदलना चाहता था।


2
...बहुत बढ़िया! यह एक महान जवाब है, @MichaelT! आपने मुझे ऐतिहासिक और व्यावहारिक दोनों कारण दिखाए, और यहां तक ​​कि सामान भी जो मुझे काफी समझ में नहीं आया, लेकिन देख सकता था। धन्यवाद। +1
Noob Saibot

@NoobSaibot चरित्र का चुनाव इस तथ्य के रूप में ज्यादा नहीं है कि ऑपरेटर पोस्टपेंड ऑपरेटर के बजाय एक प्रीपेन्ड है। इसके लिए बहुत सारे अतिरिक्त पैरेन्स की आवश्यकता होती है (हालांकि - -> सिंटैक्टिक शुगर मदद करता है) जो एक अनुभवी C ++ प्रोग्रामर के लिए भी मूर्खतापूर्ण अभी तक परेशान करने वाले कीड़े पैदा कर सकता है।
तिकड़ी वुल्फ

1
आप यह भी उल्लेख कर सकते हैं कि सी ने लगभग हर असिसी विराम चिह्न चरित्र के लिए एक उपयोग पाया। वहाँ कई पुर्जों नहीं थे। मुझे लगता है कि @एक और संभावना रही होगी।
david.pfx 15

1
@ david.pfx मैंने उस पर विस्तार किया है - हालांकि यह सी नहीं था जो कि पसंद बना ... यह बी था। और, ठीक है, मैंने एक अनुमान लगाया कि क्यों (कीबोर्ड की निकटता &और *)। B ने भी इसका उपयोग नहीं किया था, #तब आसपास कुछ और पुर्जें थे ... वहाँ भी है $

1
@ david.pfx बी ट्यूटोरियल जो मुझे मिला वह BW Kernighan द्वारा लिखा गया था। दुर्भाग्य से, डेनिस रिची अब नहीं पूछा जा सकता है (वह अक्टूबर 11 में निधन हो गया), जबकि कार्निगन जाहिरा तौर पर अभी भी प्रिंसटन में सीएस विभाग में प्रोफेसर हैं। केन थॉम्पसन (बी के अन्य निर्माता) Google पर काम करते हैं ... कुछ कीबोर्ड के साथ भी समस्या हो सकती है (सी के लिए ट्रिगर्स द्वारा संकेत दिया गया था कि हम सामान्य कुंजी के रूप में क्या सोचेंगे) यह सुझाव देते हुए कि सभी उपलब्ध नहीं थे ( मुझे यकीन नहीं है कि '@' था)।

55

मैं एक छात्र द्वारा पूछा गया कि क्या &और *चुने गए हैं, क्योंकि वे कुंजीपटल पर एक दूसरे के बगल थे (कुछ मैं पहले कभी नहीं देखा था)। बहुत सारे गुग्लिंग ने मुझे B और BCPL प्रलेखन और इस धागे का नेतृत्व किया। हालाँकि, मुझे बहुत कुछ नहीं मिला। ऐसा लगता था कि *बी में बहुत सारे कारण थे , लेकिन मुझे कुछ भी नहीं मिला &

तो @ माइकलटी के सुझाव के बाद, मैंने केन थॉम्पसन से पूछा:

से: केन थॉम्पसन <ken@google.com>

कीबोर्ड पर पास: नहीं।
c को b से कॉपी किया गया है और * वहीं हैं।
b को पहले की भाषाओं से * कुछ विधानसभा,
bcpl और मुझे लगता है कि pl / 1 है।
मुझे लगता है कि मैंने इस्तेमाल किया और क्योंकि नाम (एम्परसेंड)
"पता" की तरह लगता है। b को
टेलेटाइप मॉडल 33 टेलेटाइप के साथ चलाने के लिए डिज़ाइन किया गया था । (5 बिट बॉड-ओ कोड)
इसलिए प्रतीकों का उपयोग प्रतिबंधित था।


19
केन थॉमसन से संपर्क करने और यहां रिपोर्ट करने के लिए +1।
स्टैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.