2015-02-05 8 views
6

वहाँ C और C++ के बीच मतभेद की एक बहुत कुछ है, जबकि सिर्फ C++ कृपया कारणत्रिगुट ऑपरेटर

समझाने ठीक कार्यान्वित एक ही कोड सी में त्रुटि देता है और उन्हें में से एक पर अटक के लिए आया था
int main(void) 
{ 
    int a=10,b; 
    a>=5?b=100:b=200; 
} 

ऊपर कोड lvalue आवश्यक बताते हुए, जबकि एक ही कोड सी ++

+1

वाह, अब यह सवाल लगभग एक सटीक डुप्लिकेट है, न केवल एक संभव है। सभी प्रश्न लगभग समान हैं, वोट भी समान हैं! (वाहो -3 अच्छा मिला) – Rizier123

उत्तर

16

ऑपरेटर प्राथमिकता पर नज़र डालें।

एक स्पष्ट अपने कोड () बिना बर्ताव

तरह
(a >= 5 ? b = 100 : b) = 200; 

एक ?: अभिव्यक्ति का परिणाम एक परिवर्तनीय lvalue[#] नहीं है और इसलिए हम यह करने के लिए किसी भी मान निर्दिष्ट नहीं कर सकते हैं।

इसके अलावा, योग्य c वाक्य रचना नियम के अनुसार, का उल्लेख,

काम एक सशर्त ऑपरेटर

Relared संदर्भ की दाहिने हाथ की ओर के प्रदर्शन की अनुमति कभी नहीं किया गया है: C precedence table

OTOH, c++, अच्छी तरह के मामले में,

सशर्त ऑपरेटर काम के रूप में ही पूर्वता है में।

और दाएँ-से-बाएँ, अनिवार्य रूप से

a >= 5 ? (b = 100) : (b = 200); 

की तरह अपने कोड व्यवहार कर रही है तो, अपने कोड c++


के मामले में ठीक काम करता है वर्गीकृत किया है

[#] - अध्याय 6.5.15 के अनुसार, फुटनोट (12), C99 मानक,

एक सशर्त अभिव्यक्ति एक लाभा उत्पन्न नहीं करता है।

6

में ठीक संकलित में एक त्रुटि सी देता है क्योंकि C और C++ सा नहीं हैं मुझे भाषा, और आप टर्नरी द्वारा निहित असाइनमेंट को अनदेखा कर रहे हैं। मुझे लगता है कि आप

b = a>=5?100:200; 

जो सी और सी ++ दोनों में काम करना चाहिए।

5

सी में आप इसे अभिव्यक्ति को पेरेंटेस के भीतर रखने के साथ ठीक कर सकते हैं ताकि असाइनमेंट का मूल्यांकन वैध हो।

int main(void) 
{ 
    int a=10,b; 
    a>=5?(b=100):(b=200); 
} 

त्रुटि इसलिए है क्योंकि आप ऑपरेटर प्राथमिकता और मूल्यांकन के आदेश की परवाह नहीं करते हैं।

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