c - I=(i,++ i, 1)+1 क्या करता है; करना?




operators expression (5)

अपरिभाषित व्यवहार और अनुक्रम बिंदुओं के बारे में इस उत्तर को पढ़ने के बाद, मैंने एक छोटा कार्यक्रम लिखा:

#include <stdio.h>

int main(void) {
  int i = 5;
  i = (i, ++i, 1) + 1;
  printf("%d\n", i);
  return 0;
}

आउटपुट 2 । हे भगवान, मैं कमी नहीं देख रहा था! यहाँ क्या हो रहा है?

इसके अलावा, उपरोक्त कोड को संकलित करते समय, मुझे एक चेतावनी मिली:

px.c: 5: 8: चेतावनी: अल्पविराम अभिव्यक्ति के बाएं हाथ का कोई प्रभाव नहीं है

  [-Wunused-value]   i = (i, ++i, 1) + 1;
                        ^

क्यूं कर? लेकिन शायद यह मेरे पहले प्रश्न के उत्तर से स्वतः ही मिल जाएगा।


आपको कॉमा ऑपरेटर के लिए विकी पेज पर कुछ अच्छा पढ़ने को मिलेगा।

मूल रूप से, यह

... इसके पहले ऑपरेंड का मूल्यांकन करता है और परिणाम को छोड़ देता है, और फिर दूसरे ऑपरेंड का मूल्यांकन करता है और इस मान (और प्रकार) को लौटाता है।

इस का मतलब है कि

(i, i++, 1)

होगा, बदले में, i मूल्यांकन, परिणाम को त्यागें, i++ मूल्यांकन करें, परिणाम को त्यागें, और फिर 1 मूल्यांकन करें और वापस लौटें।


आपको यह जानना होगा कि अल्पविराम ऑपरेटर यहां क्या कर रहा है:

आपकी अभिव्यक्ति:

(i, ++i, 1)

पहली अभिव्यक्ति, i , का मूल्यांकन किया जाता है, दूसरी अभिव्यक्ति, ++i , का मूल्यांकन किया जाता है, और तीसरी अभिव्यक्ति, 1 , को पूरी अभिव्यक्ति के लिए लौटाया जाता है।

तो परिणाम है: i = 1 + 1

आपके बोनस प्रश्न के लिए, जैसा कि आप देखते हैं, पहली अभिव्यक्ति का i कोई प्रभाव नहीं है, इसलिए कंपाइलर शिकायत करता है।


का नतीजा

(i, ++i, 1)

है

1

के लिये

(i,++i,1) 

मूल्यांकन ऐसा होता है कि ऑपरेटर मूल्यांकन किए गए मूल्य को छोड़ देता है और केवल सही सबसे अधिक मूल्य को बनाए रखेगा जो 1

इसलिए

i = 1 + 1 = 2

कॉमा की एक 'उलटा' मिसाल है। यह वही है जो आपको आईबीएम (70/80 के दशक) से पुरानी पुस्तकों और सी मैनुअल से मिलेगा। तो अंतिम 'कमांड' वह है जो अभिभावक की अभिव्यक्ति में प्रयोग किया जाता है।

आधुनिक C में इसका उपयोग अजीब है लेकिन पुराने C (ANSI) में बहुत दिलचस्प है:

do { 
    /* bla bla bla, consider conditional flow with several continue's */
} while ( prepAnything(), doSomethingElse(), logic_operation);

जबकि सभी कार्यों (कार्यों) को बाएं से दाएं कहा जाता है, केवल अंतिम अभिव्यक्ति का उपयोग सशर्त 'जबकि' के परिणामस्वरूप किया जाएगा। यह 'गोटो'स को हैंडल करने से रोकता है ताकि कंडीशन चेक करने से पहले कमांड का यूनीक ब्लॉक रखा जा सके।

EDIT: यह एक हैंडलिंग फ़ंक्शन को कॉल से भी बचता है जो बाएं ऑपरेंड पर सभी लॉजिक का ध्यान रख सकता है और इसलिए तार्किक परिणाम लौटाता है। याद रखें कि, सी। के अतीत में हमारे पास इनलाइन फ़ंक्शन नहीं था, इसलिए यह कॉल ओवरहेड से बच सकता है।


i = (i, ++i, 1) + 1;

आइए इसका विश्लेषण चरण दर चरण करें।

(i,   // is evaluated but ignored, there are other expressions after comma
++i,  // i is updated but the resulting value is ignored too
1)    // this value is finally used
+ 1   // 1 is added to the previous value 1

तो हम प्राप्त करते हैं 2. और अब अंतिम काम:

i = 2;

इससे पहले कि यह अब अधिलेखित कर दिया गया था मैं जो कुछ भी था





comma-operator