2009-07-04 13 views
44

के बीच सशर्त ऑपरेटर अंतर मैं कहीं पढ़ता हूं कि ?: सी में ऑपरेटर सी ++ में थोड़ा अलग है, कि कुछ स्रोत कोड हैं जो दोनों भाषाओं में अलग-अलग काम करते हैं। दुर्भाग्यवश, मुझे कहीं भी पाठ नहीं मिल रहा है। क्या कोई जानता है कि यह अंतर क्या है?सी और सी ++

उत्तर

67

सी ++ में सशर्त ऑपरेटर एक अंतराल लौटा सकता है, जबकि सी समान कार्यक्षमता की अनुमति नहीं देता है।इसलिए, निम्नलिखित सी में कानूनी है ++: ++

*(true ? &a : &b) = 1; 
इसके अलावा सी में

, ?::

(true ? a : b) = 1; 

सी में इस को दोहराने के लिए, आप अगर/बाकी है, या सीधे संदर्भ से निपटने के लिए उपाय करने के लिए होता है और = ऑपरेटरों equal precedence and group right-to-left है, ऐसा है कि:

(true ? a = 1 : b = 2); 

वैध सी ++ कोड है, लेकिन चारों ओर पिछले ई कोष्ठकों सी में एक त्रुटि फेंक होगा xpression:

(true ? a = 1 : (b = 2)); 
+19

सी में आप लिख सकते हैं * (सच? और ए: और बी) = 1 इसके बजाय – finnw

+0

@finnw: उपयोगी। तदनुसार मेरा जवाब अपडेट किया गया। – goldPseudo

+5

दूसरा अंतर संचालन के क्रम के बारे में नहीं है, यह ऑपरेटर प्राथमिकता के बारे में है। – Barmar

22

मुख्य व्यावहारिक अंतर यह है कि सी में, मूल्यांकन?: कभी भी एल-वैल्यू का परिणाम नहीं हो सकता है जहां सी ++ में यह हो सकता है।

इसकी परिभाषा में अन्य अंतर हैं जिनमें कुछ व्यावहारिक परिणाम हैं। सी ++ में पहला ऑपरेंड एक बूल में परिवर्तित हो जाता है, सी में इसकी तुलना 0 से की जाती है। यह सी और सी ++ के बीच ==,! = आदि की परिभाषा में अंतर के समान है।

दूसरे और तीसरे ऑपरेटरों के प्रकारों के आधार पर अभिव्यक्ति के प्रकार को कम करने के लिए सी ++ में और भी जटिल नियम हैं। यह सी ++ में उपयोगकर्ता द्वारा परिभाषित अंतर्निहित रूपांतरण की संभावना को दर्शाता है।

उदाहरण कोड। मान्य सी ++; जब सी के रूप में संकलन है, लेकिन कोड जब C++ संकलन त्रुटि के बिना संकलित: "काम में अमान्य lvalue त्रुटि:" अवैध सी

extern int h(int p, int q); 

int g(int x) 
{ 
     int a = 3, b = 5; 

     (x ? a : b) = 7; 

     return h(a, b); 
} 

gcc त्रुटि उत्पन्न करता है।

संपादित करें: हालांकि: के लिए सी में एक एल मूल्य शायद आश्चर्य की बात व्याकरण वापस नहीं लौट सकते,: है:

conditional-expression: 
    logical-OR-expression 
    logical-OR-expression ? expression : conditional-expression 

इसका मतलब है कि a ? b : c = d पार्स करता है के रूप में (a ? b : c) = d भले ही (कारण 'एल-वैल्यू' नियम नहीं) इसके परिणामस्वरूप वैध अभिव्यक्ति नहीं हो सकती है।

conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 

विस्तार सशर्त अभिव्यक्ति कुछ स्थितियों में एक एल मूल्य होने के लिए अनुमति देने के लिए एक ओर जहां a ? b : c = d वैध बना सकता था व्याकरण बदलाव के बिना, नए व्याकरण परिवर्तन का मतलब: ++ यह करने के लिए व्याकरण बदल जाता

सी कि अभिव्यक्ति अब मान्य है लेकिन a ? b : (c = d) के विभिन्न अर्थों के साथ।

हालांकि मेरे पास इसके लिए कोई सबूत नहीं है, लेकिन मेरा मानना ​​है कि व्याकरण परिवर्तन मौजूदा सी कोड के साथ संगतता को तोड़ नहीं सकता है, यह अधिक संभावना है कि नया व्याकरण अभिव्यक्तियों के साथ कम आश्चर्य पैदा करेगा:

make_zero ? z = 0 : z = 1; 
+0

सी पार्स का वर्णन करने वाले उत्तर का हिस्सा गलत है। सी व्याकरण में '=' ऑपरेटर के एलएचएस में गैर-संश्लेषित '?: 'ऑपरेटर नहीं हो सकता है। सुझाया गया '(ए? बी: सी) = डी' पार्स वास्तव में संभव नहीं है। सी व्याकरण में एक? बी: सी = डी' अभिव्यक्ति बिल्कुल पारदर्शी नहीं है। कोई संकलक जो इसे '(ए? बी: सी) = डी' के रूप में व्याख्या करता है, इसे अपने जोखिम पर कर रहा है। (यह आम तौर पर हाइब्रिड सी/सी ++ कंपाइलर्स में होता है जो हुड के नीचे सी और सी ++ व्याकरण को एकजुट करने का प्रयास करते हैं।) औपचारिक रूप से, इसमें कोई समस्या नहीं है, क्योंकि अमान्य कोड अभी भी अस्वीकार कर दिया गया है। लेकिन "एक लालसा नहीं" संदेश भ्रामक है। – AnT

+0

सी में, 'ए? बी: सी = डी' बस वाक्य रचनात्मक gibberish है, टोकन का एक गैर-पारदर्शी अनुक्रम। यह एक अभिव्यक्ति नहीं है। यह दावा करते हुए कि यह एक गैर-अंतराल को असाइन करता है वह गलत है, क्योंकि यहां कोई "असाइनमेंट" नहीं है। – AnT