दिलचस्प पोस्ट
आईआईएस एक्सप्रेस के साथ कस्टम डोमेन का उपयोग करना क्षैतिज अज्ञात चौड़ाई की एक unordered सूची केंद्र कैसे करें? क्रिकइन्फो स्कोरकार्ड की html पार्सिंग मौजूदा कॉलम के लिए एक डिफ़ॉल्ट मान कैसे सेट करें यूटीएफ -8 ईमेल कैसे भेजें? गतिशील लेकिन चौकोर लेआउट करने का आसान तरीका स्काला फ्यूचर्स – टाइमआउट में बनाया गया? जावास्क्रिप्ट में पुष्टि () की डिफ़ॉल्ट शीर्षक बदलने? जावास्क्रिप्ट सरणी से यादृच्छिक मूल्य प्राप्त करना जियोओकोडर और एंड्रॉइड Google मानचित्र एपीआई v2 के साथ अक्षांश और देशांतर प्राप्त करें पकड़ना java.lang.OutOfMemoryError? वर्तमान WCF कॉल के लिए डेटा कहाँ स्टोर करना है? थ्रेडस्टैटिक सुरक्षित है? क्रोम html5 mp4 वीडियो खेल सकता है, लेकिन html5test ने कहा कि क्रोम mp4 वीडियो कोडेक का समर्थन नहीं करता एंड्रॉइड जावा; मैं एक स्थानीय JSON फ़ाइल को सूची फ़ोल्डर में संपत्ति फ़ोल्डर से कैसे पार्स कर सकता हूं MySQL त्रुटि: एक कुंजी लंबाई के बिना कुंजी विनिर्देश

सी ++ में सशर्त ऑपरेटर के अंदर कॉमा ऑपरेटर की प्राथमिकता क्या है?

यहाँ क्या हो रहा है?

#include <iostream> using namespace std; int main(){ int x=0,y=0; true? ++x, ++y : --x, --y; cout << "x: " << x << endl; cout << "y: " << y << endl; //why does y=0 here? x=0,y=0; false ? ++x, ++y : --x, --y; cout << "x: " << x << endl; cout << "y: " << y << endl; } x: 1 y: 0 x: -1 y: -1 

दूसरा मामला ठीक लगता है मुझे उम्मीद है कि पहले और पहले दोनों मामलों में एक्स और वाई दोनों में बढ़ोतरी होनी चाहिए, लेकिन केवल बाएं हाथ का संचालन वेतन वृद्धि

वेब के समाधान से एकत्रित समाधान "सी ++ में सशर्त ऑपरेटर के अंदर कॉमा ऑपरेटर की प्राथमिकता क्या है?"

पहले एक के बराबर है:

 (true ? (++x, ++y) : (--x)), --y; 

दूसरे के बराबर है:

 (false ? (++x, ++y) : (--x)), --y; 

इस --y हमेशा निष्पादित होता है। पहली पंक्ति में, वेतन वृद्धि पहले क्रियान्वित की जाती है, इसलिए x = 1, y = 0 अपेक्षित है। दूसरी पंक्ति में, x की कमी पहले क्रियान्वित की जाती है, इसलिए x = -1, y = -1 अपेक्षित है।


जैसा कि बार्मर द्वारा एक टिप्पणी में (एक और जवाब के लिए) में बताया गया है:

और अगर कोई सोच रहा है कि ++x और ++y बीच के अल्पविराम का कोई भी प्रभाव नहीं है, तो ऐसा इसलिए है क्योंकि (true? ++x) बिल्कुल भी मान्य नहीं होगा। इसलिए कंपाइलर स्कैनिंग को तब तक स्कैन कर देता है जब तक कि यह पाता नहीं है : लेकिन इसके बाद यह रोकता है जब यह एक कम वरीयता ऑपरेटर [या , इस उदाहरण में] या बयान के अंत तक पहुँच जाता है ]

y शून्य है क्योंकि कॉमा में सभी C ++ ऑपरेटरों के बीच सबसे कम वरीयता है । क्योंकि इसकी प्राथमिकता टर्नरी सशर्त ऑपरेटर की तुलना में कम है, सशर्त ऑपरेटरों को true? ++x, ++y : --x रूप में पार्स किया जाता true? ++x, ++y : --x true? ++x, ++y : --x और false? ++x, ++y : --x false? ++x, ++y : --x दोनों ही मामलों में, --y कथन निष्पादित है बिना शर्त

संपादित करें पहला कॉमा अलग है क्योंकि कंपाइलर को मिला है ? , इसलिए अब इसकी आवश्यकता है : सशर्त के "जब सच" अभिव्यक्ति को पूरा करने के लिए यही कारण है कि दोनों ++x और ++y इन में ले जाया जाता है

मानक पढ़ें

§5.18 कॉमा ऑपरेटर [expr.comma]

¶1 कॉमा ऑपरेटर समूह बाएं से दाएं

 expression: assignment-expression expression , assignment-expression 

अल्पविराम से अलग अभिव्यक्ति की एक जोड़ी को बाएं से दायें मूल्यांकन किया गया है; बाएं अभिव्यक्ति एक त्याग अभिव्यक्ति (खंड 5) है 83 हर मूल्य गणना और सही अभिव्यक्ति से जुड़े साइड इफेक्ट से पहले बाएं अभिव्यक्ति से जुड़ी हर मूल्य गणना और साइड इफेक्ट क्रमबद्ध है। परिणाम का प्रकार और मूल्य सही ऑपरेंड के प्रकार और मूल्य हैं; इसका परिणाम एक ही मान श्रेणी का है, जिसका सही ऑपरेंड है, और यह एक बिट-फ़ील्ड है यदि इसका सही ऑपरेंड एक ग्लुव्यू और बिट-फ़ील्ड है।

¶2 कॉमा को विशेष अर्थ दिया गया है, जहां संदर्भ में, [उदाहरण: कार्य करने के लिए तर्कों की सूची (5.2.2) और प्रारंभकर्ताओं की सूची (8.5) – उदाहरण के लिए) क्लॉज 5 में वर्णित कॉमा ऑपरेटर केवल कोष्ठकों में प्रकट हो सकते हैं । [ उदाहरण:

 f(a, (t=3, t+2), c); 

तीन तर्क हैं, जिनमें से दूसरे का मान 5 है। उदाहरण के लिए]