2010-01-24 16 views
23

निम्नलिखित कोड:cout << इसे प्रिंट करने के लिए कॉल का ऑर्डर प्रिंट करता है?

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue() << myQueue.dequeue(); 

प्रिंट "बा" कंसोल

जबकि करने के लिए:

myQueue.enqueue('a'); 
myQueue.enqueue('b'); 
cout << myQueue.dequeue(); 
cout << myQueue.dequeue(); 

प्रिंट "ab" ऐसा क्यों है?

ऐसा लगता है कि कोउट पहले सबसे बाहरी (निकटतम;) फ़ंक्शन को कॉल कर रहा है और अपना रास्ता काम कर रहा है, क्या यह व्यवहार करता है?

+0

के साथ चिह्नित किया गया है, तो सभी उत्तरों कहां गए? अब केवल एक ही है? – finiteloop

+1

उत्तरदाताओं ने उन्हें हटा दिया क्योंकि उन्हें एहसास हुआ कि वे गलत थे। –

+1

कुछ लोग जवाब हटाते हैं जब उन्हें पता चलता है कि वे गलत हैं। –

उत्तर

28

<< ऑपरेटर के साथ कोई अनुक्रम बिंदु नहीं है इसलिए संकलक पहले dequeue फ़ंक्शन का मूल्यांकन करने के लिए स्वतंत्र है। गारंटी दी जाती है कि दूसरे dequeue कॉल का परिणाम (जिस क्रम में यह अभिव्यक्ति में दिखाई देता है और जरूरी नहीं कि जिस क्रम में इसका मूल्यांकन किया जाता है) << '<<' के परिणामस्वरूप पहले (यदि आप मैं जो कह रहा हूं उसे प्राप्त करें)।

तो कंपाइलर इनमें से किसी भी चीज़ (छद्म मध्यवर्ती सी ++) में कुछ कोड में अनुवाद करने के लिए स्वतंत्र है। यह एक संपूर्ण सूची होने का इरादा नहीं है।

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

या

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

या

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

यहाँ temporaries मूल अभिव्यक्ति में के अनुरूप है।

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

तो, शीर्ष उदाहरण में, std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; "cout << tmp1 << tmp2;" कहने जैसा हो? या कुछ मुझे याद आ रही है? – finiteloop

+0

@segfault: हां, क्योंकि यह तरीका है <<< 'C++ व्याकरण में सहयोगी है। 'a << b << c' हमेशा समूह के रूप में समूह (एक << बी) << c'। –

+0

लेकिन उस तर्क से, cout नहीं कहेंगे << a << b कह रहा है (cout << a) << b और पहले कोउट करने के लिए आवश्यक कुछ भी करें (यानी myQueue.dequeue())? – finiteloop

6

अपने उदाहरण से कॉल:

cout << myQueue.dequeue() << myQueue.dequeue(); 

operator<< समारोह के दो कॉल के साथ निम्नलिखित अभिव्यक्ति के लिए अनुवाद:

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

cout के मूल्यांकन के आदेश, myQueue.dequeue() अनिर्दिष्ट है। हालांकि, operator<< फ़ंक्शन कॉल का क्रम अच्छी तरह से निर्दिष्ट किया गया है, जैसा 1 और 2

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