हम जानते हैं कि टर्नरी ऑपरेटर if..else क्लॉज के बजाय लागू किया जाता है। इसे ?: द्वारा दर्शाया जाता है। '?' सिंबल if भाग के बराबर है और ':' else भाग के बराबर है। निम्नलिखित 3 प्रोग्राम टर्नरी ऑपरेटर के मामले में कुछ रोचक अवलोकन बताते हैं।
निम्नलिखित प्रोग्राम बिना किसी त्रुटि के कंपाइल हो जाता है। टर्नरी एक्सप्रेशन का रिटर्न टाइप float होने की उम्मीद है (exp2 के रूप में) और exp3 (यानी लिटरल जीरो - int टाइप) implicit रूप से float में परिवर्तित हो जाता है।
#includeusing namespace std; int main(){ int test1 = 0; float fvalue = 3.111f; cout<< (test1 ? fvalue : 0) << endl; return 0; }
निम्नलिखित प्रोग्राम कंपाइल नहीं हो पाएगा, कारण यह है कि कंपाइलर टर्नरी एक्सप्रेशन के रिटर्न टाइप का पता लगाने में सक्षम नहीं है या exp2 (कैरेक्टर एरे) और exp3 (int) के बीच इम्प्लिसिट रूपांतरण उपलब्ध नहीं है।
#includeusing namespace std; int main(){ int test1 = 0; cout<< test1 ? "A String" : 0 << endl; return 0; }
निम्नलिखित प्रोग्राम कंपाइल हो सकता है, लेकिन रनटाइम पर विफल होता है। टर्नरी एक्सप्रेशन का रिटर्न टाइप (char *) टाइप तक सीमित है, फिर भी एक्सप्रेशन int लौटाती है, इसलिए प्रोग्राम विफल होता है। लिटरल में, प्रोग्राम एक्जीक्यूशन टाइम या रनटाइम पर 0th एड्रेस पर स्ट्रिंग प्रिंट करने की कोशिश करता है।
#includeusing namespace std; int main(){ int test1 = 0; cout << (test1 ? "A String" : 0) << endl; return 0; }
हम देख सकते हैं कि exp2 को आउटपुट टाइप माना जाता है और exp3 एक्जीक्यूशन टाइम या रनटाइम पर exp2 में परिवर्तित हो सकेगा। यदि रूपांतरण इम्प्लिसिट माना जाता है तो कंपाइलर रूपांतरण के लिए स्टब्स डालता है। यदि रूपांतरण एक्सप्लिसिट माना जाता है तो कंपाइलर एरर फेंकता है। यदि कोई कंपाइलर ऐसी त्रुटि को पकड़ने से चूक जाता है, तो प्रोग्राम एक्जीक्यूशन टाइम या रनटाइम पर विफल हो सकता है।