2015-08-29 8 views
6

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

मेरा प्रश्न साइड इफेक्ट्स के साथ अभिव्यक्ति क्या है और उन्हें मैक्रो में क्यों नहीं भेजा जाना चाहिए?

+0

http://stackoverflow.com/questions/7299286/whats-the-side-effect-of-the-following-macro-in-c-embedded-c एक अच्छा उदाहरण है। – Downvoter

उत्तर

8

क्लासिक उदाहरण दो मूल्य की गणना करने के लिए अधिकतम एक मैक्रो है:

#define MAX(a, b) ((a) > (b) ? (a) : (b)) 

अब की सुविधा देता है "कहते हैं" इस तरह मैक्रो:

int x = 5; 
int y = 7; 
int z = MAX(x++, y++); 

अब अगर MAX एक सामान्य कार्य था, हम उम्मीद करेंगे कि x और y एक बार बढ़ेगा, है ना? हालांकि, क्योंकि यह एक मैक्रो "कहते हैं" इस तरह बदल दिया जाता है है:

int z = ((x++) > (y++) ? (x++) : (y++)); 

जैसा कि आप देख, चर yदो बार वृद्धि की जाएगी, हालत में एक बार और एक बार ternary operator के अंत-परिणाम के रूप में।

यह दुष्प्रभाव (बाद में वृद्धि अभिव्यक्ति) और एक मैक्रो विस्तार के साथ एक अभिव्यक्ति का परिणाम है।


संबंधित नोट पर, मैक्रोज़ के साथ अन्य खतरे भी हैं। उदाहरण के लिए, इस सरल मैक्रो को लें:

#define MUL_BY_TWO(x) (x * 2) 

सरल सही लगता है? लेकिन अब क्या होगा अगर हम इसे इस तरह का उपयोग करें:

int result = MUL_BY_TWO(a + b); 

int result = (a + b * 2); 

तरह का विस्तार होगा कि और जैसा कि आप उम्मीद है कि गुणा जानता है, इसके अलावा अधिक से अधिक पूर्वता है तो अभिव्यक्ति a + b * 2a + (b * 2) के बराबर है, शायद मैक्रो लेखक द्वारा क्या इरादा नहीं था। यही कारण है कि मैक्रो में किए गए तर्कों को अपने स्वयं के कोष्ठकों के अंदर रखा जाना चाहिए है:

#define MUL_BY_TWO(x) ((x) * 2) 

फिर विस्तार

int result = ((a + b) * 2); 

जो शायद सही है किया जाएगा।

+0

इसे मिला !!! thanx !!! –

1

इसे बस एक साइड इफेक्ट करने के लिए किसी ऑब्जेक्ट को लिखना या अस्थिर वस्तु का एक पठन है।

तो एक पक्ष प्रभाव का एक उदाहरण:

i++; 

यहाँ एक मैक्रो में एक पक्ष प्रभाव का एक प्रयोग है:

#define MAX(a, b) ((a) > (b)) ? (a) : (b)) 

int a = 42; 
int b = 1; 
int c; 

c = MAX(a, b++); 

खतरा एक समारोह जहां तर्क पारित कर रहे हैं के विपरीत है मूल्य के अनुसार मैक्रो में काम करने के तरीके के कारण मैक्रो में b ऑब्जेक्ट को मैक्रो में एक या दो बार (मैक्रो तर्कों के आधार पर, यहां एक बार) संशोधित कर रहे हैं (मैक्रो परिभाषा में b++ टोकन को प्रतिस्थापित करके)।

1

साइड इफेक्ट्स परिभाषित किया जा सकता है:

एक अभिव्यक्ति का मूल्यांकन कुछ पैदा करता है और इसके अलावा में अगर वहाँ निष्पादन पर्यावरण की स्थिति में एक परिवर्तन है यह कहा जाता है अभिव्यक्ति (अपने मूल्यांकन) कुछ है कि दुष्प्रभाव)। उदाहरण के लिए:

int x = y++; //where y is also an int 

प्रारंभ आपरेशन y का मूल्य ++ ऑपरेटर के पक्ष प्रभाव के कारण बदल जाती है के अलावा।

अब एक पूर्णांक के वर्ग के लिए एक मैक्रो पर विचार करें:

#define Sq(a) a*a 
main() 
{ 
    int a=6; 
    int res=Sq(a); 
    printf("%d\n",res); 
    res=Sq(++a); 
    printf("%d",res); 
} 

आप उत्पादन

36 49

होने की अपेक्षा करेंगे हालांकि उत्पादन

36 64

है इसलिये शाब्दिक प्रतिस्थापन में मैक्रो परिणाम और

रेस हो जाता है (++ एक) * मैक्रो को साइड इफेक्ट के साथ बहस (++ क) यानी, 8 * 8 = 64

इसलिए हम पारित नहीं करना चाहिए। (http://ideone.com/mMPQLP)

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