2015-08-09 13 views
5
#include <stdio.h> 

#define sqr(a) a*a 

int main() 
{ 
    int i; 

    printf("%d",64/sqr(4)); 

    return 0; 
} 

के निष्पादन को समझने में असमर्थ हूं, मुझे आउटपुट 64 के रूप में क्यों मिल रहा है।मैं निम्नलिखित सी कोड

आम तौर पर क्या होना चाहिए यह पहले sqr(4) के लिए मान की जांच करता है और फिर विभाजित करता है। किसी भी अन्य ऑपरेटर के मामले में यह ठीक काम करता है।

कृपया समझाएं।

उत्तर

6

printf लाइन preprocessing हो जाएगा के बाद:

printf("%d",64/4*4); 

जो यह समझाएगा कि यह 64 प्रिंट क्यों करता है।

हमेशा मैक्रो परिभाषाओं में कोष्ठकों का प्रयोग जब वे भाव होते हैं: sqr(x++):

#define sqr(a) ((a)*(a)) 

यहां तक ​​कि इस तरह मैक्रो आमंत्रण के खिलाफ सुरक्षित नहीं है। तो जब तक आपको यह नहीं करना चाहिए तब तक मार्को का उपयोग न करें :)

0

मैक्रोज़ फ़ंक्शन नहीं हैं, वे (अधिकतर) गूंगा पाठ प्रतिस्थापन हैं। आपका मैक्रो कोष्ठक शामिल नहीं है इसलिए जब preprocesor यह बदल देता है, तो आपको निम्न प्राप्त करेंगे:

printf("%d",64/4*4); 

/ के बाद से और * ही पूर्वता है, यह (64/4)*4 बताते हुए है, जो निश्चित रूप से 64, की तरह है।

आप अपने sqr मैक्रो सुरक्षित रूप से, अपने तर्क वर्ग कोष्ठक में लपेट चाहते हैं:

#define sqr(a) (a*a) 
0

64/sqr(4)64/4*4 करने के लिए विस्तारित किया गया है।

आप मैक्रो शरीर parenthetise करने के लिए है और यह भी रखना चाहिए कोष्टक तर्क aroud:

#define sqr(a) ((a)*(a)) 

पैदावार: 64/(4*4)

ध्यान दें कि मैक्रो शुद्ध कर रहे हैं शाब्दिकसी पूर्वप्रक्रमक द्वारा किया जाता प्रतिस्थापन से पहले वास्तविक संकलन शुरू होता है।

एक बेहतर और प्रकार-सुरक्षित दृष्टिकोण एक inline समारोह का उपयोग करने के होगा:

static inline int sqr(int a) 
{ 
    return a * a; 
} 

यह संभावना संकलक के रूप में ज्यादा के रूप में मैक्रो होगा द्वारा कॉलर कोड में inlined हो जाएगा। ओटीओएच, कंपाइलर आंतरिक हेरिस्टिक्स के आधार पर, बहुत अच्छा फैसला नहीं कर सकता है। आम तौर पर, आपको उचित तरीके से उपयोग करने के लिए कंपाइलर पर भरोसा करना चाहिए, जब तक कि आपके पास गंभीर प्रदर्शन/कोड-आकार के मुद्दे न हों।

यह a तर्क को दो बार मूल्यांकन करने के खिलाफ भी रक्षा करेगा। यही कारण है कि महत्वपूर्ण है, अगर वहाँ की तरह

int i[2], *p = i; 
sqr(*p++); 

दुष्प्रभाव मैक्रो संस्करण के लिए, इस अपरिभाषित व्यवहार (मूल्यांकन के अपरिभाषित आदेश) का परिणाम देगा कर रहे हैं:

((*p++) * (*p++)) 
संबंधित मुद्दे