2016-03-03 11 views
7

मेरे पास एक सरल सी कोड और अल्पविराम (,) ऑपरेटर युक्त अभिव्यक्तियों के बारे में बड़ा भ्रम है।सी में, क्यों अभिव्यक्ति (स्टेटमेंट) कोमाटा (स्टेट) ऑपरेटर अलग-अलग काम करता है

int main(){ 
    int i=0,j=11,c; 
    c=i=j,++i; 
    printf("c=%d i=%d\n",c,i); 
    c=(i=j,++i); 
    printf("c=%d i=%d\n",c,i); 
    return 0; 
} 

ऊपर कोड प्रिंट:

c=11 i=12 
c=12 i=12 

मेरे प्रश्न हैं:

  1. अल्पविराम (,) एक ऑपरेटर के रूप में के वास्तविक कार्य क्या है?
  2. ++, और = से अधिक प्राथमिकता है, तो अल्पविराम के बाईं ओर अभिव्यक्ति के लिए मूल्यांकन क्यों किया जाता है?
  3. ऑर्डर में क्या होगा यदि किसी अभिव्यक्ति में ऑपरेटर्स को विभिन्न प्राथमिकता वाले होते हैं, तो यह अल्पविराम (,) पर निर्भर करेगा?
  4. क्या यह अर्धविराम (;) के विकल्प की तरह व्यवहार कर रहा है?
+2

मैं एक विशेषज्ञ लेकिन इस 'ग = i = j नहीं हूँ, मैं' घ ++ U.B. तरह लग रहा है –

+3

@ मार्गरब्लूम नंबर, कॉमा ऑपरेटर एक अनुक्रम बिंदु, आईआईआरसी पेश करता है। –

+0

http://stackoverflow.com/questions/2087026/effect-of-using-a-comma-instead-of-a-semi-colon-in-c-and-c – Turamarth

उत्तर

10

असाइनमेंट ऑपरेटर को अल्पविराम ऑपरेटर की उच्च प्राथमिकता है। इस प्रकार अभिव्यक्ति

c = i = j, ++i; 

सी मानक (6.5.17 अल्पविराम ऑपरेटर)

2 एक अल्पविराम ऑपरेटर के बाईं संकार्य एक के रूप में मूल्यांकन किया जाता है के अनुसार

(c = i = j), ++i; 

के बराबर है शून्य अभिव्यक्ति; अपने मूल्यांकन के बीच एक अनुक्रम बिंदु है और दाएं ऑपरेंड के है। फिर सही ऑपरेंड का मूल्यांकन किया जाता है; परिणाम उसके प्रकार और value.114)

अल्पविराम ऑपरेटर त्याग दिया जाता है का परिणाम ऊपर अभिव्यक्ति में है, लेकिन यह बढ़ रही है i का एक पक्ष प्रभाव है।

इस अभिव्यक्ति

c = (i = j, ++i); 

में कारण कोष्ठकों का उपयोग करने के लिए आप ऊपर अभिव्यक्ति के मूल्यांकन का क्रम बदल। अब यह

c = ((i = j), ++i); 

के बराबर है और चर c सी स्टैंडर्ड से बोली ऊपर सूचीबद्ध के अनुसार अभिव्यक्ति ++i का मूल्य हो जाता है।

1

अच्छी तरह से इसे विभाजित करें। पहले मामले में सी और मैं j => c = i = j = 11 का मान लेता हूं; तो आप वृद्धि = = i = 12; तो कोड इस

c = j; 
i = j; 
++i; 

दूसरे मामले के लिए मैं j के मूल्य लेता है के बराबर है => i = j = 11 और फिर आप मैं बढ़ाने के => मैं = 12 और फिर ग मैं का मान लेता है = > सी = 12;

तो कोड इस के बराबर है:

i = j; 
++i; 
c = i; 
4

ऑपरेटर अल्पविराम कई बयान निष्पादित और पिछले बयान का ही परिणाम वापस जाने के लिए है।

c=i=j,++i; के लिए

तो: c=i=j मार डाला है, तो ++i और बाद ++i की है कि परिणाम दिया जाता है (लेकिन नहीं थे)।

और c=(i=j,++i); के लिए, ऑपरेटर पूर्वता के अनुसार, i=j निष्पादित किया जाता है, और ++i के तुरंत बाद ही निष्पादित किया जाता है, और फिर (i=j, ++i), जो पिछले बयान का नतीजा है के परिणाम की c को दिखावा, यानी ++i

तो, अल्पविराम का व्यवहार वास्तव में अर्धविराम के समान नहीं है। आप इसे c=i=j,++i; जैसे विकल्प के रूप में उपयोग कर सकते हैं।

व्यक्तिगत रूप से, मैं इस ऑपरेटर, जो कम पठनीय और कम पोषणीय उत्पन्न करता है का उपयोग करने के लिए प्रोत्साहित नहीं करते कोड

+0

++ मैं है दिए गए कथन के लिए i = j के बाद किया गया c = (i = j, ++ i); – skyconfusion

+0

@skyconfusion क्षमा करें, खराब अंग्रेजी, ज़ाहिर है कि, मैं अपना जवाब संपादित करता हूं – Garf365

+0

क्या कोई मुझे समझा सकता है कि मेरा जवाब क्यों कम हो गया है? – Garf365

1

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

इस तरह से सोचें, यदि आपके पास लूप में किसी भी स्थान पर वृद्धि के लिए कई लूप चर हैं, तो आप अलग-अलग लाइनों पर अपने स्वयं के व्यक्तिगत चरों पर सभी जोड़ों/घटाव आदि को अलग कर सकते हैं, लेकिन क्यूं कर?जहां उन्हें निष्पादित किया जाता है (कारण के भीतर) कोड के संचालन के लिए कोई परिणाम है। फिर उन्हें कोड पर प्रतिकूल प्रभाव के साथ एक पंक्ति पर बुलाया जा सकता है।

+1

अल्पविराम ऑपरेटर केवल, 2 ऑपरेंड है तो यह केवल बाईं संकार्य का परिणाम त्यागने और का परिणाम का उपयोग करेगा सर्वाधिक उपयुक्त। सही एक हमेशा अंतिम है। – Lundin

+0

"फिर उन्हें कोड पर प्रतिकूल प्रभाव के बिना एक पंक्ति पर बुलाया जा सकता है।" नहीं, वे वास्तव में नहीं कर सकते हैं। यह कोड 'के लिए (int i = 0, int j = 0, int k = 0; i Lundin

+1

@ लुंडिन बकवास। बेशक आप एक लूप में एक से अधिक लूप इटेटरेटर हो सकते हैं। सी बेसिक नहीं है, और लूप इटरेटर्स के पास विशेष स्थिति नहीं है; लूप के लिए सिर्फ तीन सींग हैं। यदि आप 'जारी रखें' का उपयोग करना चाहते हैं तो आपका दूसरा उदाहरण कोड गलत हो जाएगा, और यह 'जे' और 'के' को अनावश्यक रूप से बड़ा दायरा देता है। –

2

ऑपरेटर के रूप में अल्पविराम (,) का वास्तविक कार्य क्या है?

अल्पविराम ऑपरेटर मुख्य रूप से एक अनिवार्य विशेषता है। यह कैसे काम करता है के विवरण के लिए See this

++ की तुलना में अधिक प्राथमिकता है, और =, अल्पविराम के बाईं ओर अभिव्यक्ति के लिए मूल्यांकन क्यों किया जाता है? ऑर्डर में क्या होगा यदि किसी अभिव्यक्ति में ऑपरेटर्स को विभिन्न प्राथमिकता वाले होते हैं, तो यह अल्पविराम (,) पर निर्भर करेगा?

बाएं ऑपरेंड का दुष्प्रभावों के लिए मूल्यांकन किया जाता है। अल्पविराम ऑपरेटर का परिणाम मूल्यांकन किए गए सही संचालन का परिणाम है। ध्यान दें कि सीए

यह सभी ऑपरेटरों की सबसे कम प्राथमिकता है, यह अर्धविराम (;) के विकल्प की तरह व्यवहार कर रहा है?

तरह, हाँ। अर्द्ध-कोलन और अल्पविराम ऑपरेटर दोनों में अनुक्रम बिंदु शामिल है। अंतर यह है कि अल्पविराम ऑपरेटर एक बयान का अंत नहीं है, इसलिए इसे उसी लाइन पर अन्य ऑपरेटरों के साथ निचोड़ा जा सकता है, और यह परिणाम भी देता है।

वास्तव में ऐसा कोई कारण नहीं है कि आप कभी ऐसा क्यों करना चाहते हैं। अल्पविराम ऑपरेटर का मुख्य उपयोग कोड को खराब करना है, इसे टालना चाहिए।एकमात्र कारण यह है कि आपको यह सीखने की आवश्यकता क्यों है कि यह कैसे काम करता है, क्योंकि आप इसमें क्रैप कोड का सामना कर सकते हैं।

उदाहरण के लिए, अपने बकवास कोड अधिक पठनीय और सुरक्षित कुछ में फिर से लिखा जाना चाहिए:

int main(){ 
    int i=0; 
    int j=11; 
    int c; 

    i=j; 
    c=j; 
    i++; 
    printf("c=%d i=%d\n",c,i); 

    i=j; 
    i++; 
    c=i; 
    printf("c=%d i=%d\n",c,i); 

    return 0; 
} 
+1

'// i = j; // अनावश्यक, हमने पहले ही यह किया है, फिर से क्यों? "सही नहीं है क्योंकि उपरोक्त 'i ++' है, इसलिए वास्तव में आप' c = 11, i = 12' के साथ समाप्त होंगे 'c = 13 , i = 13' –

+0

@NeilTwist आह हाँ, तय है। – Lundin

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