2010-12-17 23 views
7

करना संभव डुप्लिकेट का मूल्यांकन करता है:
in what versions of c is a block inside parenthesis used to return a value valid?यह वैध सी क्यों है? ; --- ({123}) 123

निम्नलिखित एक ठेठ मैक्स मैक्रो का एक प्रकार के लिए सुरक्षित संस्करण (इस जीसीसी पर काम करता है 4.4.5):

#define max(a,b) \ 
({ __typeof__ (a) _a = (a); \ 
    __typeof__ (b) _b = (b); \ 
_a > _b ? _a : _b; }) 

यहाँ, हम देखते हैं कि इस अभिव्यक्ति, अधिकतम (ए, बी) अभिव्यक्ति की परिणाम देता है

_a > _b ? _a : _b; 

भले ही यह अभिव्यक्ति एक ब्लॉक में है। तो, मैं जांच की और पाया कि यह वैध C:

int a = ({123;}); // a is 123 

कोई व्याख्या कर सकते हैं क्यों यह वैध व्याकरण और क्या ({बयान}) है की सही व्यवहार है? साथ ही, आप देखेंगे कि {123;} मान्य अभिव्यक्ति नहीं है, लेकिन केवल ({123;}) है।

+3

डुप्स: [अक्टूबर 200 9] (http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside -पेरथेसिस-प्रयुक्त-टू-रिटर्न-ए-वैल्यू-मान्य) [मई 2010] (http://stackoverflow.com/questions/2892981/weird-initialization-in-c) [जनवरी 2010] (http: // stackoverflow .com/प्रश्न/2075 9 30/अधिक जानकारी-ऑन-इन-सी) –

उत्तर

16

यह वैध C99 या C89 और न ही C++ है। यह जीसीसी विस्तार है, जिसे "स्टेटमेंट एक्सप्रेशन" कहा जाता है। जीसीसी के साथ सी कोड को मान्य करने के लिए विकल्प -ansi -pedantic जोड़ें। इसके अलावा उपयोगी विकल्प बयान भाव के लिए -W -Wall -Wextra

डॉक्स यहाँ http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

हैं यह जीएनयू विस्तार व्यापक रूप से जीएनयू कोड और लिनक्स में प्रयोग किया जाता है, तो यह समर्थित है न केवल जीसीसी द्वारा, लेकिन यह भी इंटेल सी ++ संकलक जैसे आधुनिक compilers में , सन स्टूडियो, एलएलवीएम + क्लैंग, ...

+1

वर्तमान में (जीसीसी 4.4.5), सी, '-ansi' के लिए '-std = c89' के बराबर है (और सी ++ के लिए' -std = C++ 98')। कुछ अन्य उपयोगी विकल्प '-std = c99',' -std = gnu89', '-std = gnu99',' -std = C++ 0x', '-std = gnu ++ 0x' हैं। – pmg

+0

@pmg, यदि आप जानते हैं, तो कुछ आने वाले मानक में "कथन exprs" शामिल होगा? – osgx

+2

हम्म ... यह [ओपन-एसडीडी साइट पर पीडीएफ] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf) "स्टेटमेंट एक्सप्रेशन" मानक बनने के संकेत कुछ समय। – pmg

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