जानबूझकर या दुर्घटना से, आपके पास <<पहली आउटपुट लाइन के अंत में है, जहां आप शायद मतलब रखते थे ;। तो आप अनिवार्य रूप से है
cout << "2+3 = "; // this, of course, prints "2+3 = "
cout << cout; // this prints "1"
cout << 2 + 3; // this prints "5"
cout << endl; // this finishes the line
तो सवाल इस पर उबलता है: cout << cout;प्रिंट क्यों करता है "1"?
यह पता चला है, शायद आश्चर्यजनक रूप से, सूक्ष्म रूप से। std::cout, इसके आधार वर्ग के माध्यम से std::basic_ios, एक निश्चित प्रकार का रूपांतरण ऑपरेटर प्रदान करता है जिसका उद्देश्य बूलियन संदर्भ में उपयोग किया जाना है
while (cout) { PrintSomething(cout); }
यह एक बहुत ही खराब उदाहरण है, क्योंकि असफल होने के लिए आउटपुट प्राप्त करना मुश्किल है - लेकिन std::basic_iosवास्तव में इनपुट और आउटपुट स्ट्रीम दोनों के लिए एक आधार वर्ग है, और इनपुट के लिए यह बहुत अधिक समझ में आता है:
int value;
while (cin >> value) { DoSomethingWith(value); }
(धारा के अंत में लूप से बाहर हो जाता है, या जब धारा वर्ण एक वैध पूर्णांक नहीं बनाते हैं)।
अब, इस रूपांतरण ऑपरेटर की सटीक परिभाषा मानक के C ++ 03 और C ++ 11 संस्करणों के बीच बदल गई है। पुराने संस्करणों में, इसे operator void*() const;(आमतौर पर लागू किया गया था return fail() ? NULL : this;), जबकि नए में यह explicit operator bool() const;(आमतौर पर बस के रूप में लागू किया गया है return !fail();)। दोनों घोषणाएं एक बूलियन संदर्भ में ठीक काम करती हैं, लेकिन इस तरह के संदर्भ के बाहर इस्तेमाल किए जाने पर (गलत) अलग व्यवहार करती हैं।
विशेष रूप से, C ++ 03 नियमों के तहत, कुछ पते के cout << coutरूप में व्याख्या की जाएगी cout << cout.operator void*()। C ++ 11 नियमों के तहत, cout << coutसभी को संकलित नहीं करना चाहिए, क्योंकि ऑपरेटर घोषित किया गया है explicitऔर इस प्रकार निहित रूपांतरण में भाग नहीं ले सकता है। यह वास्तव में परिवर्तन के लिए प्राथमिक प्रेरणा थी - निरर्थक कोड को संकलन से रोकना। एक कंपाइलर जो किसी भी मानक के अनुरूप होता है, वह एक प्रोग्राम का उत्पादन नहीं करता है जो प्रिंट करता है "1"।
जाहिरा तौर पर, कुछ C ++ क्रियान्वयन इस तरह से कंपाइलर और लाइब्रेरी को मिलाने और मिलान करने की अनुमति देते हैं, जो गैर-अनुरूप परिणाम उत्पन्न करते हैं (@StephanLechner को उद्धृत करते हुए: "मुझे एक सेटिंग मिली xcode में जो 1 का उत्पादन करता है, और दूसरा वह है जो एक पता देता है: भाषा बोली c ++ 98 को "मानक पुस्तकालय libc ++ (LLV मानक पुस्तकालय के साथ c ++ 11 समर्थन)" पैदावार 1 के साथ जोड़ा गया है, जबकि c ++ 98 libstdc के साथ संयुक्त है (gnu c ++ मानक पुस्तकालय) एक पता देता है; ")। आपके पास एक C ++ 03-स्टाइल कंपाइलर हो सकता है explicitजो कनवर्ज़न ऑपरेटर्स (जो C ++ 11 में नए हैं) को C ++ 11-स्टाइल लाइब्रेरी के साथ संयुक्त नहीं करता है जो रूपांतरण को परिभाषित करता है operator bool()। इस तरह के मिश्रण के साथ, इसकी cout << coutव्याख्या करना संभव हो जाता है cout << cout.operator bool(), जो बदले में बस cout << trueऔर प्रिंट होता है "1"।
;पहली आउटपुट लाइन के अंत में अर्धविराम चाहते हैं , नहीं<<। आप वो नहीं छाप रहे हैं जो आपको लगता है कि आप छाप रहे हैं। आप कर रहे हैंcout << cout, जो प्रिंट1(यह उपयोग करता हैcout.operator bool(), मुझे लगता है)। तब5(से2+3) तुरंत अनुसरण करता है, जिससे यह पंद्रह की संख्या जैसा दिखता है।