दो स्ट्रिंग साहित्यिकों को समेटना


121

मैं Koenig द्वारा त्वरित C ​​++ पढ़ रहा हूं। वह लिखते हैं कि "नया विचार यह है कि हम एक स्ट्रिंग और एक स्ट्रिंग शाब्दिक को संक्षिप्त करने के लिए + का उपयोग कर सकते हैं - या, इस मामले के लिए, दो तार (लेकिन दो स्ट्रिंग साहित्यिक नहीं)।

ठीक है, यह समझ में आता है कि मुझे लगता है। अब इस पर रोशनी डालने के लिए दो अलग-अलग कवायदों का मतलब है।

क्या निम्नलिखित परिभाषाएँ मान्य हैं?

const string hello = "Hello";

const string message = hello + ",world" + "!";

अब, मैंने उपरोक्त को निष्पादित करने की कोशिश की और यह काम कर गया! इसलिए मैं खुश था।

फिर मैंने अगला अभ्यास करने की कोशिश की;

const string exclam = "!";

const string message = "Hello" + ",world" + exclam;

यह काम नहीं किया। अब मुझे यह समझ में आ गया है कि इस तथ्य से आपको कुछ लेना-देना नहीं है कि आप दो स्ट्रिंग शाब्दिकों को समाप्‍त नहीं कर सकते हैं, लेकिन मैं इस बात का अर्थ नहीं समझता कि मैं काम करने का पहला उदाहरण पाने में सफल रहा (नहीं ", दुनिया" और "!" "दो स्ट्रिंग शाब्दिक? क्या यह काम नहीं किया जाना चाहिए?) लेकिन दूसरा नहीं।


4
const string message = "Hello" ",world" + exclam(जैसे पहले छोड़ देना +) काम ठीक ठीक करना।
n0rd

1
@ जो - "Hello" + ", world!"जब आप कर सकते हैं तो कोई क्यों लिखेगा "Hello, world!"। हमेशा की तरह C ++ में एक कथित समस्या के लिए एक भयानक और सरल समाधान है। :-)
बो पर्सन

2
@ केवल एक चीज जो मैं सोच सकता हूं वह यह है कि क्या आप एक परिभाषा (#define) का उपयोग करते हैं
जो फिलिप्स

@ फिर भी, आप "Hello" ", world!"( +) के बिना लिखने की अधिक संभावना रखते हैं । सी ++ के बारे में कई शिकायतें हो सकती हैं, लेकिन मुझे नहीं लगता कि यह यहां से निपट रही है। यह बिल्कुल वैसा ही है जैसा आपने लिखा है 1 / 3 + 1.5, और शिकायत की है क्योंकि विभाजन अभिन्न विभाजन था। बेहतर या बदतर के लिए, यह ज्यादातर भाषाओं का काम है।
जेम्स कांजे

2
@Bo Persson वास्तव में यह सुविधा "hello" " world" == "hello world"उपयोगी है यदि आपको एक लंबी स्ट्रिंग लिखनी है और आप इसे अपनी खिड़की से बाहर नहीं जाना चाहते हैं या आप कुछ लाइन की लंबाई के दायरे में रहना चाहते हैं। या अगर एक तार एक मैक्रो में परिभाषित किया गया है।
दिमित्र स्लावचेव

जवाबों:


140
const string message = "Hello" + ",world" + exclam;

+ऑपरेटर बाएँ-से-सही है संबद्धता, तो बराबर parenthesized अभिव्यक्ति है:

const string message = (("Hello" + ",world") + exclam);

जैसा कि आप देख सकते हैं, दो स्ट्रिंग शाब्दिक हैं "Hello"और ",world"पहले " एड " हैं, इसलिए त्रुटि।

पहले दो तारों में से एक को एक std::stringवस्तु होना चाहिए :

const string message = string("Hello") + ",world" + exclam;

वैकल्पिक रूप से, आप +अभिव्यक्ति के उस हिस्से को छोटा करके पहले मूल्यांकन के लिए दूसरे को मजबूर कर सकते हैं :

const string message = "Hello" + (",world" + exclam);

यह समझ में आता है कि आपका पहला उदाहरण ( hello + ",world" + "!") काम करता है क्योंकि std::string( hello) सबसे बाईं ओर के तर्कों में से एक है +। इसका +मूल्यांकन किया जाता है, परिणाम std::stringसमवर्ती स्ट्रिंग के साथ एक वस्तु है, और जिसके परिणामस्वरूप std::stringतब के साथ संक्षिप्त किया जाता है "!"


के रूप में आप दो स्ट्रिंग शाब्दिक का उपयोग क्यों नहीं कर सकते हैं +, यह इसलिए है क्योंकि एक स्ट्रिंग शाब्दिक सिर्फ वर्णों की एक सरणी है ( const char [N]जहां एक Nऔर स्ट्रिंग स्ट्रिंग की लंबाई प्लस शून्य के लिए है)। जब आप अधिकांश संदर्भों में एक सरणी का उपयोग करते हैं, तो इसे एक पॉइंटर में इसके प्रारंभिक तत्व में बदल दिया जाता है।

इसलिए, जब आप करने की कोशिश करते हैं "Hello" + ",world", तो आप वास्तव में जो करने की कोशिश कर रहे हैं , वह दो const char*एस को एक साथ जोड़ना है , जो संभव नहीं है (इसका मतलब दो बिंदुओं को एक साथ जोड़ना होगा?) और अगर यह ऐसा होता तो आप क्या नहीं करते? करना चाहता था।


ध्यान दें कि आप स्ट्रिंग शाब्दिकों को एक-दूसरे के बगल में रखकर समतल कर सकते हैं ; उदाहरण के लिए, निम्नलिखित दो समतुल्य हैं:

"Hello" ",world"
"Hello,world"

यह उपयोगी है यदि आपके पास एक लंबी स्ट्रिंग शाब्दिक है जिसे आप कई लाइनों पर तोड़ना चाहते हैं। उन्हें स्ट्रिंग शाब्दिक होना चाहिए, हालांकि: यह const char*संकेत या const char[N]सरणियों के साथ काम नहीं करेगा ।


3
इसके अलावा, const string message = "Hello" + (",world"+exclam);काम भी करेंगे, क्योंकि स्पष्ट कोष्ठक के कारण (यह एक शब्द है?)।
चिन्मय कांची

1
इससे भी अधिक पूर्ण हो सकता है यदि आप बताते हैं कि पहला उदाहरण क्यों काम करता है:const string message = ((hello + ",world") + "!");
मार्क रैनसम

धन्यवाद! मुझे संदेह था कि यह बाएं से दाएं समरूपता के साथ कुछ करने के लिए था, लेकिन निश्चित नहीं था और यह शब्दार्थ अंतर मेरे लिए बहुत मायने नहीं रखता था। मैं जवाब की सराहना करता हूं!
आर्थर कॉल

2
मैं उल्लेख करता हूं कि "Hello" ",world"वाक्यविन्यास न केवल कई लाइनों में टूटने के लिए उपयोगी है, बल्कि यह भी है कि जब एक स्ट्रिंग शाब्दिक एक मैक्रो (या यहां तक ​​कि दोनों) है। फिर संकलन समय में होता है।
मेलेबियस

8

आपको हमेशा प्रकारों पर ध्यान देना चाहिए ।

वे सब तार की तरह लगता है, हालांकि "Hello"और ",world"कर रहे हैं शाब्दिक

और आपके उदाहरण में, exclamएक std::stringवस्तु है।

C ++ में एक ऑपरेटर अधिभार होता है जो एक std::stringऑब्जेक्ट लेता है और इसमें एक और स्ट्रिंग जोड़ता है। जब आप किसी std::stringवस्तु को शाब्दिक रूप से संक्षिप्त करते हैं तो यह शाब्दिक के लिए उपयुक्त कास्टिंग बना देगा।

लेकिन अगर आप दो शाब्दिकों को समेटने की कोशिश करते हैं, तो संकलक एक ऐसे संचालक को खोजने में सक्षम नहीं होगा जो दो शाब्दिक लेता है।


Std :: ऑपरेटर + देखें जो एक std::stringदूसरे के साथ अतिरेक प्रदान करता है std::string, एक चरित्र सरणी, या एक एकल वर्ण।
डेविडआरआर

7

आपका दूसरा उदाहरण काम नहीं करता है क्योंकि operator +दो स्ट्रिंग शाब्दिकों के लिए नहीं है। ध्यान दें कि एक स्ट्रिंग शाब्दिक प्रकार का नहीं है string, बल्कि इसके प्रकार का है const char *। यदि आप इसे इस तरह संशोधित करते हैं तो आपका दूसरा उदाहरण काम करेगा:

const string message = string("Hello") + ",world" + exclam;


2

संचालन के आदेश के कारण, यदि आपको 1 मिलता है, तो:

(हैलो + ", दुनिया") + "!" जो हल + "करने के लिए हल करता है!" और अंत में नमस्ते

2 मामले में, जैसा कि जेम्स ने कहा, आपको मिलता है:

("हैलो" + ", दुनिया") + एक्सलैम जो 2 स्ट्रिंग शाब्दिक का संक्षिप्त नाम है।

आशा है कि यह स्पष्ट है :)


1

एक स्ट्रिंग (या सटीक होने के लिए std::string) और एक चरित्र शाब्दिक के बीच का अंतर यह है कि उत्तरार्द्ध के लिए कोई +ऑपरेटर परिभाषित नहीं है। यही कारण है कि दूसरा उदाहरण विफल रहता है।

पहले मामले में, संकलक operator+पहले तर्क के साथ एक उपयुक्त पाता है stringऔर दूसरा एक चरित्र शाब्दिक ( const char*) होता है इसलिए इसका उपयोग किया जाता है। उस ऑपरेशन का परिणाम फिर से एक है string, इसलिए इसे जोड़ते समय एक ही चाल को दोहराता "!"है।

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