दिलचस्प पोस्ट
क्या हमें सूची दृश्य को बदलने के लिए रीसाइक्लाइजर का उपयोग करना चाहिए? आईओएस / एंड्रॉइड पर वेब ऐप से मूल तिथि पिकर को आमंत्रित करें क्या मैं जीवनकाल का उपयोग कर जंग स्ट्रैक्ट्स बनाने के लिए करता हूं जो कि एक-दूसरे को चक्रीय रूप से संदर्भित करते हैं? UITableView – अनुभाग शीर्षलेख रंग बदलें सही सिंगलटन पैटर्न उद्देश्य सी (आईओएस)? एनजीएनएक्स किसी भी डोमेन नाम का जवाब क्यों दे रहा है? PHP सहयोगी सरणी डुप्लिकेट कीज़ अगर मैं एक मौजूदा वितरण प्रमाण पत्र रद्द कर देता हूं, तो क्या यह मौजूदा ऐप्स के साथ कुछ गड़बड़ कर देगा? नोड। जेएस निर्भरता के लिए विंडोज पर पायथन चला रहा है डिबगर को उस अपवाद पर बंद न करें जब इसे फेंक दिया जाता है और पकड़ा जाता है एक एंड्रॉइड ट्रायल एप्लिकेशन बनाना जो एक निश्चित समय अवधि के बाद समाप्त होता है युग काल को समय-समय पर परिवर्तित करना आपको कब शाखाएं चाहिए? पावरशेल आईई 9 कॉम ऑब्जेक्ट में वेबपेज पर नेविगेट करने के बाद सभी रिक्त गुण हैं गणना (एक ^ बी)% एमओडी

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

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

#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 है। उदाहरण के लिए]