ইচ্ছাকৃতভাবে বা দুর্ঘটনাক্রমে হোক না কেন, আপনার <<প্রথম আউটপুট লাইনের শেষে রয়েছে, যেখানে আপনি সম্ভবত বোঝাতে চেয়েছিলেন ;। সুতরাং আপনি মূলত আছে
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); }
(স্ট্রিমের শেষে লুপ থেকে বেরিয়ে যায়, বা যখন স্ট্রিম অক্ষরগুলি বৈধ পূর্ণসংখ্যার গঠন করে না)।
এখন, এই রূপান্তর অপারেটরের সঠিক সংজ্ঞাটি স্ট্যান্ডার্ডের সি ++ 03 এবং সি ++ 11 সংস্করণের মধ্যে পরিবর্তিত হয়েছে। পুরানো সংস্করণগুলিতে এটি operator void*() const;(সাধারণত হিসাবে প্রয়োগ করা হয়েছিল return fail() ? NULL : this;), যখন এটি আরও নতুন explicit operator bool() const;(সাধারণত সাধারণভাবে প্রয়োগ করা হয় return !fail();)। উভয় ঘোষণা একটি বুলিয়ান প্রসঙ্গে ভাল কাজ করে, তবে যখন এ জাতীয় প্রসঙ্গে বাইরে (ভুল) ব্যবহার করা হয় তখন আলাদা আচরণ করে।
বিশেষত, সি ++ 03 বিধিগুলির অধীনে, cout << coutব্যাখ্যা করা হবে cout << cout.operator void*()এবং কিছু ঠিকানা মুদ্রণ করা হবে। সি ++ 11 নিয়মের অধীনে, cout << coutমোটেও সংকলন করা উচিত নয়, কারণ অপারেটর ঘোষিত হয় explicitএবং সুতরাং অন্তর্নিহিত রূপান্তরগুলিতে অংশ নিতে পারে না। এটি আসলে পরিবর্তনের প্রাথমিক প্রেরণা ছিল - সংবেদনহীন কোডটি সংকলন থেকে রোধ করা। একটি সংকলক যা উভয় স্ট্যান্ডার্ড অনুসারে প্রিন্ট করে এমন কোনও প্রোগ্রাম তৈরি করে না "1"।
স্পষ্টতই, কিছু সি ++ প্রয়োগগুলি সংযোজক এবং লাইব্রেরিটিকে এমনভাবে মিশ্রিত করতে এবং মেলানোর অনুমতি দেয় যা অ-অনুসরনকারী ফলাফলের উত্পন্ন করে (@ স্টিফটালেকনার উদ্ধৃত করে: "আমি এক্সকোডে একটি সেটিংস পেয়েছি যা 1 উত্পাদন করে এবং অন্য একটি সেটিংস যা একটি ঠিকানা দেয়: ভাষা উপভাষা সি ++ 98 "স্ট্যান্ডার্ড লাইব্রেরি লাইবসি ++ (সি ++ 11 সাপোর্টের সাথে এলএলভিএম স্ট্যান্ডার্ড লাইব্রেরি) এর সাথে মিলিত" 1 ফলন করে, যেখানে সি ++ 98 লিবিস্টডিসি (জিএনও সি ++ স্ট্যান্ডার্ড লাইব্রেরি) এর সাথে মিলিত একটি ঠিকানা দেয়; ")। আপনার কাছে একটি সি ++ 03-স্টাইলের সংকলক থাকতে পারে explicitযা রূপান্তর অপারেটরগুলি (যা সি ++ 11 তে নতুন) বোঝে না একটি সি ++ 11-স্টাইল লাইব্রেরির সাথে সংযুক্ত যা রূপান্তরটিকে সংজ্ঞায়িত করে operator bool()। এই জাতীয় মিশ্রণের সাহায্যে এটি cout << coutব্যাখ্যা করা সম্ভব হয় cout << cout.operator bool()যা cout << trueঘুরেফিরে সহজ এবং মুদ্রণযোগ্য "1"।
;প্রথম আউটপুট লাইনের শেষে সেমিকোলন চান , না<<। আপনি কী মুদ্রণ করছেন বলে আপনি মুদ্রণ করছেন না। আপনি করছেনcout << cout, যা মুদ্রণ করে1(এটি ব্যবহার করেcout.operator bool(), আমি মনে করি)। তারপরে5(থেকে2+3) অবিলম্বে অনুসরণ করে, এটিকে পনের নম্বর বলে মনে হচ্ছে।