2016-07-15 8 views
7

मैं जानता हूँ कि नीचे दिए गए दो बयानों ही परिणाम दे:प्रदर्शन एक + = ख और एक = एक के बीच अंतर + b

a+=b; 
a=a+b; 

a += b के मामले में, aa = a + b के मामले में केवल एक बार, जबकि मूल्यांकन किया जाता है , a का मूल्यांकन दो बार किया जाता है।

क्या दोनों के बीच प्रदर्शन में कोई अंतर है? यदि नहीं, तो उपर्युक्त में कोई भिन्नता है जहां कोई अंतर है?

+1

हाँ, दूसरे में अधिक टाइपिंग शामिल है .... –

+0

आप किस अंतर की उम्मीद कर रहे हैं? किस संदर्भ में अंतर? आपका प्रश्न उन टिप्पणियों के बिना ऑफ-विषय है। – 2501

+0

आंतरिक प्रक्रिया की तरह –

उत्तर

4

मानक (अनुभाग 6.5.16.2, बिंदु 3) से:

एक यौगिक काम फार्म केE1सेशन=E2 सरल काम अभिव्यक्ति से अलग है * ई 1 = ई 1सेशन(ई 2) केवल उस समय में lvalue ई 1 का मूल्यांकन केवल एक बार किया जाता है।

यही है, अगर इसके बजाय आप

*a += 1 

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

संपादित करें: शायद एक बेहतर उदाहरण कुछ निम्नलिखित की तरह अजीब है (वास्तव कोस कि & ख == & मेरे मामले में एक -1):

int a, b, *p; 

a = 1; b = 5; p = &a; 
*p += (--p == &b) ? 1 : 0; 
printf("%d %d\n",a,b); // prints 1 6, because --p happens first, then *p 

a = 1; b = 5; p = &a; 
*p = *p + ((--p == &b) ? 1 : 0); 
printf("%d %d\n",a,b); // prints 1 2, because the second *p is evaluated first, 
         // then --p and then the first *p 
+3

अनुक्रम बिंदुओं के कारण दूसरा मामला भी यूबी नहीं है? – glglgl

+1

@glglgl हां, उदाहरण अर्थहीन हैं। और कई अलग-अलग कारणों से अपरिभाषित व्यवहार का कारण बनता है। – 2501

+0

हाँ, तकनीकी रूप से दोनों व्यवहार अपरिभाषित है, लेकिन इसका मतलब यह नहीं है कि वे व्यर्थ हैं, मैं कहता हूँ चाहते हैं। बस एक + बी कर सकते हैं अपरिभाषित व्यवहार में परिणाम। मुझे संदेह है कि कई प्रोग्रामर इस तरह के मामलों में अच्छी तरह से चलने के लिए चेक जोड़ते हैं। एक विशिष्ट संकलक के संदर्भ में, मैं उदाहरण के दो रूपों के बीच अंतर को दर्शाता हुआ का एक अच्छा पर्याप्त काम करता है लगता है। बेशक, बेहतर उदाहरण हमेशा स्वागत है। – mweerden

1

a+=1 शायद जाने के लिए (सबसे अच्छा तरीका है हालांकि प्रदर्शन में अंतर लगभग महत्वहीन है)। यदि आप कुछ प्रदर्शन सुधार प्राप्त करने की कोशिश कर रहे हैं तो आपको अपने कोड के अन्य हिस्सों की तलाश करनी चाहिए।

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