इस 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 जैसे कुछ कोडिंग दिशानिर्देशों को पढ़ने में रुचि हो सकती है ।