2012-08-27 22 views
7

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

#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 

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

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

इस प्रकार --y हमेशा निष्पादित होने

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

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

+0

कोड है कि वास्तव में संकलित प्रदान करें -। अन्यथा मैं मदद करने के लिए आप –

+0

'++ y' होता है परेशान नहीं किया जा सकता है, लेकिन फिर' --y' करता है। 'सच? ++ x, ++ y: --x, --y' को '(true? ++ x, ++ y: --x) के रूप में पार्स किया गया है, --y' – oldrinb

+0

@AdrianCornish यह कोड संकलित करता है; क्या तुमने कोशिश की? – chrisaycock

उत्तर

17

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

और मामले किसी में क्यों ++x और ++y के बीच अल्पविराम ही प्रभाव नहीं है सोच रहा है, यह है (true? ++x):


(एक और जवाब देने के लिए) Barmar द्वारा एक टिप्पणी में बताया गया है बिलकुल मान्य नहीं होगा। इसलिए संकलक स्कैनिंग रखता है जब तक कि यह : नहीं पाता है, लेकिन उससे परे यह कम प्राथमिकता ऑपरेटर [(, इस उदाहरण में) या कथन के अंत तक पहुंचता है जब यह बंद हो जाता है]

+1

अपने अंतिम अनुच्छेद को अधिक सटीक रूप से बताने के लिए: ऑपरेटरों की प्राथमिकता (और सहयोगीता) केवल ऑपरेटर के बाएं और दाएं भाग में ऑपरेटरों की बाध्यकारी को प्रभावित करती है, मध्य में नहीं। बेशक टर्नरी ऑपरेटर केवल एक ही मध्यस्थ है जो पहले स्थान पर है। लेकिन इन पंक्तियों के साथ कोई एक यूनरी (पहचान) ऑपरेटर के रूप में कोष्ठक की एक जोड़ी पर विचार कर सकता है जिसका सिंगल ऑपरेंड मध्य में है ("ऑपरेटर प्रतीकों" के बीच), जो समझाएगा कि यह समूह क्यों प्राप्त करता है, किसी भी प्राथमिकता नियमों से अप्रभावित क्यों है। –

0

पढ़ें मानक

§5.18 अल्पविराम ऑपरेटर [expr.comma]

¶1 अल्पविराम ऑपरेटर समूहों बाएँ-से-सही।

expression: 
assignment-expression 
expression , assignment-expression 

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

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

+0

सफाई के लिए धन्यवाद जॉन –

+0

धन्यवाद। सच? (++ एक्स, ++ वाई): (--x, --y); तय की। सबक: हमेशा ब्रांडेसिस का उपयोग करें जहां इरादा गैर तुच्छ है। – hhbilly

+2

@ user1626720 - उल्लेख नहीं है "टर्नरी ऑपरेटर का दुरुपयोग न करें"। प्रश्न में कोड लिखा जाना चाहिए यदि ... और, क्योंकि टर्नरी ऑपरेटर के मूल्य को त्याग दिया जाता है। –

4

y शून्य है क्योंकि अल्पविराम the lowest precedence among all C++ operators है: [उदाहरण

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

तीन तर्कों, दूसरी जिनमें से मूल्य 5. अंत उदाहरण है है]।चूंकि इसकी प्राथमिकता टर्नरी सशर्त ऑपरेटर की तुलना में कम है, इसलिए सशर्त ऑपरेटरों को true? ++x, ++y : --x और false? ++x, ++y : --x के रूप में पार्स किया गया है। दोनों स्थितियों में, --y कथन बिना शर्त निष्पादित किया गया है।

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

+3

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

+1

ओह और कभी नहीं करें 'अगर (x == 100,000)' सीखा कि कठिन तरीका ;-) –

संबंधित मुद्दे