इस C कोड का आउटपुट 49 है, लेकिन कोई मुझे कैसे समझा सकता है? [डुप्लिकेट]
#include <stdio.h>
#define CUBE(x) (x * x * x)
int main() {
printf("%d", CUBE(4+5));
return 0;
}
जवाब
मैक्रो कोड को चालू करेगा:
printf("%d", (4+5 * 4+5 * 4+5));
जो प्रभावी है:
printf("%d", 4 + (5*4) + (5*4) + 5); // 29
यदि आप 9पाने के लिए घन चाहते हैं 729, तो आपको लिखना चाहिए CUBE((4+5))।
संकलन प्रक्रिया के दौरान मैक्रो का विस्तार इस प्रकार है:
printf("%d", (4+5 * 4+5 * 4+5));
क्योंकि *इसकी अपेक्षा एक उच्च पूर्वता है +, इस अभिव्यक्ति का मूल्यांकन अपेक्षित के बजाय (4 + (5 * 4) + (5 * 4) + 5)उत्पादन के रूप में किया जाता 49है 729।
इस तरह के ऑपरेटर की पूर्ववर्ती समस्याओं से बचने के लिए, सभी मैक्रो तर्कों को मैक्रो की परिभाषा में और साथ ही साथ अभिव्यक्ति में भी समतल किया जाना चाहिए:
#define CUBE(x) ((x) * (x) * (x))
ध्यान दें कि यह विस्तार कई बार CUBEमूल्यांकन xकरता है, जो कि एक समस्या है अगर मैक्रो तर्क के दुष्प्रभाव हैं, जैसे कि CUBE(i++)।
इन सभी मुद्दों से बचने के लिए, फ़ंक्शन का उपयोग करें और कंपाइलर को इसे ऑप्टिमाइज़ करने दें:
int cube(int x) {
return x * x * x;
}
आप static inlineइस फ़ंक्शन की परिभाषा के सामने जोड़ सकते हैं , लेकिन आधुनिक ऑप्टिमाइज़र अभी भी इसके बिना फ़ंक्शन को इनलाइन करेंगे।
सी प्रीप्रोसेसर वास्तव में 4 + 5 के लिए x के सभी उदाहरणों को प्रतिस्थापित करेगा, जिसके परिणामस्वरूप निम्नलिखित कोड हैं:
i = 4+5*4+5*4+5;
(पहले गुणा, फिर जोड़)
CUBE((4+5))यदि आप संख्याओं को जोड़ना चाहते हैं तो आपको इनपुट देना होगा और फिर भेजना होगा CUBE। कारण वें CUBE(4+5)को मूल रूप से विस्तारित किया जाता है 4+5*4+5*4+5क्योंकि यह संपूर्ण 4+5के स्थान पर सेट होता है x। तो, 4+5*4+5*4+5= 4+20+20+5के रूप में गुणा आता है और फिर उन्हें जोड़ने से दे देंगे 49।
मैक्रो को परिभाषित करें जैसे #define CUBE(x) ((x)*(x)*(x))यह वास्तव में पहले (4+5)ऑपरेशन को आगे बढ़ाता है (x)और फिर *ऑपरेशन करता है।
CUBE((4+5))मैक्रो को कॉल करने के दौरान एक और तरीका उपयोग किया जाता है , यह मूल रूप से पहले दो नंबर और (4+5)= जोड़ा गया 9और फिर CUBE(9)जैसे:
#include<stdio.h>
#define CUBE(x) (x * x * x)
int main( )
{
printf("%d", CUBE((4+5)));
return 0;
}
मॉडर्न C , फिर n1570 ड्राफ्ट C मानक, और GCC और GDB और CPP के प्रलेखन को पढ़ें । इस C संदर्भ वेबसाइट को भी देखें ।
मौजूदा ओपन सोर्स प्रोजेक्ट्स से प्रेरणा लें, जैसे जीथब या जीएनयू सॉफ्टवेयर ।
हाल ही में एक साथ जीसीसी संकलक, यह आह्वान के रूप में gcc -Wall -Wextra -g। -C -Eप्रीप्रोस्ड फॉर्म प्राप्त करने के लिए विकल्पों का भी उपयोग करें ।
आप GCC के स्टेटमेंट-एक्सपर्ट विस्तार से भी रूचि ले सकते हैं ।
आपका CUBE(4+5)मैक्रो-विस्तारित है 4+5*4+5*4+5जिसकी गणना C ऑपरेटर्स4+(5*4)+(5*4)+5 की पूर्वता के अनुसार की जाती है ।
किसी static inlineफ़ंक्शन को कोड करने पर विचार करें
static inline int cube(int x) { return x*x*x; }
या यदि आपको एक मैक्रो की आवश्यकता है, तो कम से कम
#define CUBE(X) ((X)*(X)*(X))
जो अच्छी तरह से काम नहीं करेगा CUBE(i++)(जबकि inlineफ़ंक्शन के साथ , cube(i++)वही करता है जो आप इसे करना चाहते हैं: iएक बार वेतन वृद्धि !)।
BTW, आप कुछ C कोड जनरेट करने के लिए GPP , या GNU m4 , (या अपने स्वयं के जनरेटर, या GNU बायसन ) का उपयोग कर सकते हैं। अंगूठे के एक नियम के रूप में, एएसटी एस के साथ सोचें : जब आप सी कोड उत्पन्न करते हैं, तो बहुत सारे बेकार कोष्ठक का उत्सर्जन करते हैं, जैसे कि चिकन स्कीम , SWIG में , या CAIA में या मेरे कई में
आप अपने कोड (और शायद फ्रामा-सी ) पर क्लैंग स्टैटिक विश्लेषक का उपयोग कर सकते हैं ।
आपको MISRA C या GNU जैसे कुछ कोडिंग दिशानिर्देशों को पढ़ने में रुचि हो सकती है ।