यह बताने के लिए कि यहां क्या हो रहा है, चलिए चीजों को अधिक सरल बनाते हैं: cout<<2*2+1*1;
। पहले क्या होता है, 2 * 2 या 1 * 1? एक संभावित उत्तर 2 * 2 पहले होना चाहिए, क्योंकि यह सबसे बाएं चीज है। लेकिन सी ++ मानक कहता है: कौन परवाह करता है ?! आखिरकार, परिणाम 5 या तो रास्ता है। लेकिन कभी-कभी यह मायने रखता है। उदाहरण के लिए, यदि f
और g
दो कार्य हैं, और हम f()+g()
करते हैं, तो कोई गारंटी नहीं है जिसे पहले कहा जाता है। यदि f
कोई संदेश प्रिंट करता है, लेकिन g
प्रोग्राम से बाहर निकलता है, तो संदेश कभी मुद्रित नहीं किया जा सकता है। आपके मामले में, i[2]
को i[0]
से पहले बुलाया गया, क्योंकि सी ++ सोचता है कि इससे कोई फर्क नहीं पड़ता। आपके पास दो विकल्प हैं:
एक विकल्प आपके कोड को बदलना है, इससे कोई फर्क नहीं पड़ता। अपने []
ऑपरेटर को फिर से लिखें ताकि यह Int
को परिवर्तित न करे, और इसके बजाय एक नया Int
लौटाता है। यह शायद वैसे भी एक अच्छा विचार है, क्योंकि यह ग्रह पर अन्य सभी []
ऑपरेटरों के 99% के साथ संगत बनाएगा। इसके लिए कम कोड की आवश्यकता होती है:
Int &operator[](int x) { return this->v + x;}
। 2 * 2 पहले किया जाता है,
cout<<i[0]; cout<<i[2];
कुछ भाषाओं में वास्तव में गारंटी देते हैं कि 2*2+1*1
में कार्य करें:
आपका दूसरा विकल्प आपके []
एक ही रखने के लिए है, और दो कथनों में अपने मुद्रण अलग हो गए। लेकिन सी ++ नहीं।
संपादित करें: मैं जितना स्पष्ट था उतना स्पष्ट नहीं था। आइए धीरे-धीरे कोशिश करें। 2*2+1*1
का मूल्यांकन करने के लिए सी ++ के दो तरीके हैं।
विधि 1: 2*2+1*1 ---> 4+1*1 ---> 4+1 --->5
।
विधि 2: 2*2+1*1 ---> 2*2+1 ---> 4+1 --->5
।
दोनों मामलों में हमें एक ही जवाब मिलता है।
आइए इसे फिर से एक अलग अभिव्यक्ति के साथ आज़माएं: i[0]+i[2]
।
विधि 1: i[0]+i[2] ---> 2+i[2] ---> 2+4 ---> 6
।
विधि 2: i[0]+i[2] ---> i[0]+4 ---> 4+4 ---> 8
।
हमें एक अलग उत्तर मिला, क्योंकि []
के दुष्प्रभाव हैं, इसलिए यह महत्वपूर्ण है कि हम i[0]
या i[2]
पहले करें। सी ++ के अनुसार, ये दोनों वैध उत्तर हैं। अब, हम आपकी मूल समस्या पर हमला करने के लिए तैयार हैं। जैसा कि आप जल्द ही देखेंगे, इसमें <<
ऑपरेटर के साथ लगभग कुछ भी नहीं है।
सी ++ cout << i[0] << i[2]
के साथ कैसे काम करता है? पहले की तरह, दो विकल्प हैं।
विधि 1: cout << i[0] << i[2] ---> cout << 2 << i[2] ---> cout << 2 << 4
।
विधि 2: cout << i[0] << i[2] ---> cout << i[0] << 4 ---> cout << 4 << 4
।
पहली विधि आपके जैसा अपेक्षित 24 प्रिंट करेगी। लेकिन सी ++ के अनुसार, विधि 2 समान रूप से अच्छा है, और यह आपके जैसा 44 प्रिंट करेगा। ध्यान दें कि समस्या <<
कहने से पहले होती है। इसे रोकने के लिए <<
अधिभारित करने का कोई तरीका नहीं है, क्योंकि <<
समय चल रहा है, "क्षति" पहले ही हो चुकी है।
'cout << i [0] << i [2]; 'इस तरह लिखा जा सकता है:' ऑपरेटर << (ऑपरेटर << (cout, i [0]), i [2]);' – Xaqq
ऐसा लगता है कि दो के मूल्यांकन का क्रम << अच्छी तरह परिभाषित नहीं है। अपना कोड डीबग करें और आप देखेंगे कि मैं [2] पहले कहलाता हूं। – Tim3880
मैं वास्तव में 'ऑपरेटर []' दुष्प्रभाव बनाने के खिलाफ सुझाव दूंगा। मुझे लगता है कि व्यवहार आपको किसी बिंदु पर फिर से काटने जा रहा है न कि यहां। कल्पना करें कि यह मल्टीथ्रेडिंग के साथ कैसे इंटरैक्ट करता है, उदा। –