के बीच सशर्त ऑपरेटर अंतर मैं कहीं पढ़ता हूं कि ?:
सी में ऑपरेटर सी ++ में थोड़ा अलग है, कि कुछ स्रोत कोड हैं जो दोनों भाषाओं में अलग-अलग काम करते हैं। दुर्भाग्यवश, मुझे कहीं भी पाठ नहीं मिल रहा है। क्या कोई जानता है कि यह अंतर क्या है?सी और सी ++
उत्तर
सी ++ में सशर्त ऑपरेटर एक अंतराल लौटा सकता है, जबकि सी समान कार्यक्षमता की अनुमति नहीं देता है।इसलिए, निम्नलिखित सी में कानूनी है ++: ++
*(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));
मुख्य व्यावहारिक अंतर यह है कि सी में, मूल्यांकन?: कभी भी एल-वैल्यू का परिणाम नहीं हो सकता है जहां सी ++ में यह हो सकता है।
इसकी परिभाषा में अन्य अंतर हैं जिनमें कुछ व्यावहारिक परिणाम हैं। सी ++ में पहला ऑपरेंड एक बूल में परिवर्तित हो जाता है, सी में इसकी तुलना 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;
सी पार्स का वर्णन करने वाले उत्तर का हिस्सा गलत है। सी व्याकरण में '=' ऑपरेटर के एलएचएस में गैर-संश्लेषित '?: 'ऑपरेटर नहीं हो सकता है। सुझाया गया '(ए? बी: सी) = डी' पार्स वास्तव में संभव नहीं है। सी व्याकरण में एक? बी: सी = डी' अभिव्यक्ति बिल्कुल पारदर्शी नहीं है। कोई संकलक जो इसे '(ए? बी: सी) = डी' के रूप में व्याख्या करता है, इसे अपने जोखिम पर कर रहा है। (यह आम तौर पर हाइब्रिड सी/सी ++ कंपाइलर्स में होता है जो हुड के नीचे सी और सी ++ व्याकरण को एकजुट करने का प्रयास करते हैं।) औपचारिक रूप से, इसमें कोई समस्या नहीं है, क्योंकि अमान्य कोड अभी भी अस्वीकार कर दिया गया है। लेकिन "एक लालसा नहीं" संदेश भ्रामक है। – AnT
सी में, 'ए? बी: सी = डी' बस वाक्य रचनात्मक gibberish है, टोकन का एक गैर-पारदर्शी अनुक्रम। यह एक अभिव्यक्ति नहीं है। यह दावा करते हुए कि यह एक गैर-अंतराल को असाइन करता है वह गलत है, क्योंकि यहां कोई "असाइनमेंट" नहीं है। – AnT
- 1. सी ++ संदर्भ और सी/सी ++
- 2. प्रबंधित सी ++ सी # और सी ++
- 3. सी और सी ++
- 4. प्रबंधित सी ++ और सी ++
- 5. सी और सी ++
- 6. सी और सी ++
- 7. सी ++ और सी #
- 8. सी # और सी ++
- 9. सी और सी ++
- 10. सी और सी ++
- 11. सी और सी ++
- 12. मिश्रित सी और सी ++
- 13. सी # और विजुअल सी #?
- 14. सी और सी ++
- 15. सी/सी ++ और लिबरसेरियल
- 16. सी और सी ++
- 17. डीएलओपेन और सी/सी ++
- 18. सी ++ और सी #
- 19. सी और सी ++
- 20. सी ++, सी # और रूबी
- 21. सी और सी ++
- 22. सी और सी ++
- 23. सी और सी ++
- 24. संयोजन सी ++ और सी #
- 25. क्यों सी और सी ++
- 26. उद्देश्य सी और सी ++
- 27. सी ++ और सी # गति
- 28. सी और सी ++
- 29. सी और सी ++ कोड
- 30. मिक्सिंग सी और उद्देश्य-सी
सी में आप लिख सकते हैं * (सच? और ए: और बी) = 1 इसके बजाय – finnw
@finnw: उपयोगी। तदनुसार मेरा जवाब अपडेट किया गया। – goldPseudo
दूसरा अंतर संचालन के क्रम के बारे में नहीं है, यह ऑपरेटर प्राथमिकता के बारे में है। – Barmar