समीपवर्ती स्ट्रिंग शाब्दिकों पर


17

C और C ++ एक स्ट्रिंग स्ट्रिंग शाब्दिक के रूप में आसन्न स्ट्रिंग शाब्दिक संकलन करता है। उदाहरण के लिए यह:

"Some text..." "and more text"

के बराबर है:

"Some text...and more text"

सी # या जावा जैसी अन्य सी-पारिवारिक भाषाओं में, यह एक वाक्यविन्यास त्रुटि है (जो पूरी तरह से ठीक बीटीडब्ल्यू है)।

C और C ++ के ऐसा करने का औचित्य / ऐतिहासिक कारण क्या है?

जवाबों:


24

मूल सी भाषा को 1969-1972 में डिज़ाइन किया गया था जब कंप्यूटिंग में अभी भी 80 कॉलम वाले कार्ड का प्रभुत्व था। इसके डिजाइनरों ने ASR-33 टेलेटाइप जैसे 80 स्तंभ उपकरणों का उपयोग किया। इन उपकरणों ने स्वचालित रूप से पाठ को लपेट नहीं किया था, इसलिए 80 कॉलम के भीतर स्रोत कोड रखने के लिए एक वास्तविक प्रोत्साहन था। फोरट्रान और कोबोल के पास ऐसा करने के लिए स्पष्ट निरंतरता तंत्र था, इससे पहले कि वे अंततः मुक्त प्रारूप में चले गए।

यह डेनिस रिची (मुझे लगता है) के लिए प्रतिभा का एक स्ट्रोक था कि यह महसूस करने के लिए कि व्याकरण में कोई अस्पष्टता नहीं थी और आसन्न शाब्दिक तारों को समेटने के लिए संकलक प्राप्त करने के सरल समीक्षक द्वारा लंबे ASCII तार को 80 स्तंभों में फिट किया जा सकता था। अनगिनत सी प्रोग्रामर उस छोटी सी विशेषता के लिए आभारी थे।

एक बार जब यह सुविधा चालू हो जाती है, तो इसे क्यों हटाया जाएगा? यह कोई दुःख का कारण नहीं है और अक्सर उपयोगी होता है। मैं एक इच्छा के लिए और अधिक भाषाओं में था। आधुनिक प्रवृत्ति में ट्रिपल कोट्स या अन्य प्रतीकों के साथ विस्तारित तार हैं, लेकिन सी में इस सुविधा की सरलता को कभी भी पार नहीं किया गया है।


8
एक और कारण यह है कि यह स्ट्रिंग #define FOO "foo-value""FOO's value is " FOO "."
मैडल के

3
@ ब्लरफ्ल: बस इतना ही। यह समझना महत्वपूर्ण है कि स्थूल प्रतिस्थापन पूरा होने के बाद स्ट्रिंग संयोजन होता है।
david.pfx

7

C के पास +C # और Java की तरह कोई विशिष्ट स्ट्रिंग कॉन्फैक्शन ऑपरेटर नहीं है । सी # या जावा में, जब कंपाइलर देखता है

"a" + "b"

यह कोड को ठीक उसी तरह संकलित कर सकता है जैसे कि

"ab"

स्रोत कोड में लिखे गए थे। C में, हालांकि, संकलक को पहचानने और पूर्व-गणना करने वाले तारों के संघनन का वर्णन करने के लिए समान रूप से आसान सिंटैक्स नहीं है। इसलिए C दशकों के डिजाइनरों ने इसे चुना

"a" "b"

मतलब बिल्कुल वैसा ही होगा जैसा कि

"ab"

स्वाभाविक रूप से C ++ को एक ही सम्मेलन विरासत में मिला। जबकि मानक C ++ लाइब्रेरी का मतलब स्ट्रिंग कॉन्फ्रेनेशन +पर ओवरलोड होता std::stringहै, कंपाइलर समेटने का प्रयास नहीं करता है "a" + "b"क्योंकि यह वास्तव में एक त्रुटि है (आप दो const char *पॉइंटर्स को एक साथ नहीं जोड़ सकते हैं)।


1
सी में कोई विशिष्ट स्ट्रिंग प्रकार नहीं है, स्मृति में वर्णों के लिए पॉइंटर्स के बजाय ऑप्टिंग। आप संकेत नहीं जोड़ सकते हैं, और यहां तक ​​कि अगर +किसी भी तरह से सहमति बनाने के लिए बनाया गया था, तो आपको अभी भी समस्या को हल करना होगा जहां स्मृति में संक्षिप्त स्ट्रिंग जाती है।
ब्लरफ्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.