2011-08-19 12 views
5

http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects पढ़ने के दौरान, मैं इस उदाहरण में आया:सी ब्लॉक अभिव्यक्ति बन जाता है: ({int a = 1; int b = 2; a + b;}) 3 बराबर है

\#define max(a,b) \ 
    ({ typeof (a) _a = (a); \ 
     typeof (b) _b = (b); \ 
    _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK? 

जो आप एक फ़ंक्शन की तरह उपयोग कर सकते हैं, यानी max(1,2) एक अभिव्यक्ति है जो 2.

है मेरा प्रश्न है, ({ statment-list last-expression; }) निर्माण कैसे करता है अंतिम अभिव्यक्ति के मूल्य का मूल्यांकन? विशेष रूप से, इस निर्माण का एक पार्स पेड़ कैसा दिखता है? मैंने सोचा कि { } हमेशा एक यौगिक-कथन का मतलब है, और बयानों के पास कोई मूल्य नहीं है। मैंने सी व्याकरण में चारों ओर खुदाई करने की कोशिश की और अभी भी इस समस्या को समझ नहीं पाया।

+0

'42;' एक बयान भी है :-) – paxdiablo

+1

आह, लेकिन मुझे संदेह है कि ओपी जानता है कि '42; 'एक बयान है क्योंकि यह मानक सी में एक बयान है। कथन अभिव्यक्ति है हालांकि, मानक सी में नहीं। –

उत्तर

10

यह एक जीसीसी एक्सटेंशन है जिसे Statement Expressions कहा जाता है। यह मानक सी

+0

स्टेटमेंट एक्सप्रेशन ?! सिरदर्द की तरह लगता है। – BoltClock

+0

धन्यवाद! बेशक मुझे वास्तव में "टाइपफॉइड दोनों कीवर्ड, और कोष्ठक के भीतर एक कंपाउंड स्टेटमेंट रखने का निर्माण होना चाहिए था, लोकप्रिय जीएनयू सी कंपाइलर (जीसीसी) में लागू गैर-मानक एक्सटेंशन हैं।" उफ़। –

+0

मुझे उन्हें पसंद है। वे इस तरह बुद्धिमान सामान करने की अनुमति देते हैं। :) – balki

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