सबसे पहले, हेंक और ओलिवियर के उत्तर सही हैं; मैं इसे कुछ अलग तरीके से समझाना चाहता हूं। विशेष रूप से, मैं आपके द्वारा किए गए इस बिंदु को संबोधित करना चाहता हूं। आपके पास यह कथन है:
int k = 10;
int c = 30;
k += c += k += c;
और फिर आप गलत तरीके से निष्कर्ष निकालते हैं कि इस बयान के सेट के समान परिणाम देना चाहिए:
int k = 10;
int c = 30;
k += c;
c += k;
k += c;
यह देखना जानकारीपूर्ण है कि आपको वह गलत कैसे मिला, और इसे सही कैसे करना है। इसे तोड़ने का सही तरीका इस तरह है।
सबसे पहले, सबसे बाहरी = लिखो
k = k + (c += k += c);
दूसरा, सबसे बाहरी + को फिर से लिखना। मुझे आशा है कि आप सहमत होंगे कि x = y + z को हमेशा "एक अस्थायी के लिए मूल्यांकन y, एक अस्थायी के लिए z का मूल्यांकन, अस्थायी का योग, x का योग असाइन करें" के समान होना चाहिए । तो चलिए इसे बहुत स्पष्ट करते हैं:
int t1 = k;
int t2 = (c += k += c);
k = t1 + t2;
सुनिश्चित करें कि स्पष्ट है, क्योंकि यह वह कदम है जो आपको गलत लगा । जटिल ऑपरेशन को सरल ऑपरेशन में तोड़ते समय, आपको यह सुनिश्चित करना होगा कि आप धीरे-धीरे और सावधानी से करें और कदमों को छोड़ें नहीं । कदम उठाना वह है जहाँ हम गलतियाँ करते हैं।
ठीक है, अब धीरे-धीरे और ध्यान से, t2 को असाइनमेंट को तोड़ दें।
int t1 = k;
int t2 = (c = c + (k += c));
k = t1 + t2;
असाइनमेंट t2 को वैसा ही मान देगा जैसा कि c को असाइन किया गया है, तो चलिए बताते हैं कि:
int t1 = k;
int t2 = c + (k += c);
c = t2;
k = t1 + t2;
महान। अब दूसरी पंक्ति को तोड़ें:
int t1 = k;
int t3 = c;
int t4 = (k += c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
महान, हम प्रगति कर रहे हैं। T4 को असाइनमेंट तोड़ें:
int t1 = k;
int t3 = c;
int t4 = (k = k + c);
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
अब तीसरी पंक्ति को तोड़ें:
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
और अब हम पूरी बात देख सकते हैं:
int k = 10;
int c = 30;
int t1 = k;
int t3 = c;
int t4 = k + c;
k = t4;
int t2 = t3 + t4;
c = t2;
k = t1 + t2;
तो जब हम किया जाता है, k 80 है और c 70 है।
अब आइए देखें कि यह आईएल में कैसे लागू किया जाता है:
int t1 = k;
int t3 = c;
is implemented as
ldloc.0
ldloc.1
अब यह थोड़ा मुश्किल है:
int t4 = k + c;
k = t4;
is implemented as
ldloc.0
ldloc.1
add
dup
stloc.0
हम उपरोक्त को लागू कर सकते थे
ldloc.0
ldloc.1
add
stloc.0
ldloc.0
लेकिन हम "डिप" ट्रिक का उपयोग करते हैं क्योंकि यह कोड को छोटा बनाता है और घबराने पर आसान बनाता है, और हमें वही परिणाम मिलता है। सामान्य तौर पर, सी # कोड जनरेटर जितना संभव हो सके स्टैक पर अस्थायी "पंचांग" रखने की कोशिश करता है। यदि आपको कम एपीरेल के साथ आईएल का पालन करना आसान लगता है, तो अनुकूलन बंद कर दें , और कोड जनरेटर कम आक्रामक होगा।
अब हमें सी करने के लिए एक ही चाल करनी है:
int t2 = t3 + t4;
c = t2;
is implemented as:
add
dup
stloc.1
और अंत में:
k = t1 + t2;
is implemented as
add
stloc.0
चूँकि हमें किसी और चीज़ के लिए राशि की आवश्यकता नहीं है, इसलिए हम इसे धोखा नहीं देते हैं। स्टैक अब खाली है, और हम बयान के अंत में हैं।
कहानी का नैतिक है: जब आप एक जटिल कार्यक्रम को समझने की कोशिश कर रहे हैं, तो हमेशा एक समय में एक ऑपरेशन को तोड़ दें । छोटे कटौती मत करो; वे तुम्हें भटका देंगे।