GCC 7.3 - 3.10.2. Operator Precedence Problems

3.10.2 ऑपरेटर की पूर्ववर्ती समस्याएं




gcc

3.10.2 ऑपरेटर की पूर्ववर्ती समस्याएं

आपने देखा होगा कि ऊपर दिखाए गए अधिकांश मैक्रो डेफिनिशन उदाहरणों में, मैक्रो तर्क नाम की प्रत्येक घटना में चारों ओर कोष्ठक थे। इसके अलावा, कोष्ठक की एक और जोड़ी आमतौर पर संपूर्ण मैक्रो परिभाषा को घेर लेती है। इसीलिए मैक्रोज़ को इस तरह लिखना सबसे अच्छा है।

मान लीजिए कि आप एक मैक्रो को निम्नानुसार परिभाषित करते हैं,

#define ceil_div(x, y) (x + y - 1) / y

जिसका उद्देश्य फूट डालना, गोल करना है। (इस ऑपरेशन के लिए एक उपयोग यह सुनिश्चित करने के लिए है कि कितने निश्चित ऑब्जेक्ट्स को कितनी निश्चित वस्तुओं को धारण करने की आवश्यकता है।) फिर मान लीजिए कि इसका उपयोग निम्नानुसार किया जाता है:

a = ceil_div (b & c, sizeof (int));
     → a = (b & c + sizeof (int) - 1) / sizeof (int);

यह वह नहीं करता है जो इरादा है। C के ऑपरेटर-पूर्वता नियम इसे इसके समतुल्य बनाते हैं:

a = (b & (c + sizeof (int) - 1)) / sizeof (int);

हम क्या चाहते हैं:

a = ((b & c) + sizeof (int) - 1)) / sizeof (int);

मैक्रो को परिभाषित करना

#define ceil_div(x, y) ((x) + (y) - 1) / (y)

वांछित परिणाम प्रदान करता है।

अनअटेंडेड समूहन का परिणाम दूसरे तरीके से हो सकता है। sizeof ceil_div(1, 2) पर विचार करें। इसमें एक C अभिव्यक्ति की उपस्थिति है जो ceil_div (1, 2) के प्रकार की गणना करेगा, लेकिन वास्तव में इसका मतलब कुछ बहुत अलग है। यहाँ इसका विस्तार है:

sizeof ((1) + (2) - 1) / (2)

यह एक पूर्णांक का आकार लेता है और इसे दो से विभाजित करता है। पूर्ववर्ती नियमों ने विभाजन को sizeof बाहर रखा है जब यह अंदर होने का इरादा था।

संपूर्ण मैक्रो परिभाषा के आसपास कोष्ठक ऐसी समस्याओं को रोकते हैं। यहाँ, फिर, ceil_div को परिभाषित करने का अनुशंसित तरीका है:

#define ceil_div(x, y) (((x) + (y) - 1) / (y))

अगला: अर्धविराम को Misnesting , पिछला: Misnesting , अप: मैक्रो नुकसान [ Contents ] [ Index ]