2010-12-17 65 views
7

可能重複:
in what versions of c is a block inside parenthesis used to return a value valid?爲什麼這個有效的C? ---({123;})的計算結果爲123

下面是一個典型的MAX宏的類型安全版本(這適用於GCC 4.4.5):

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

在這裏,我們看到這個表情,MAX(A,b)返回表達式的結果

_a > _b ? _a : _b; 

即使此表達式在塊中。所以,我調查,發現這是有效的C:

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

有人可以解釋爲什麼這是有效的語法什麼的({語句})是真正的行爲嗎?另外,您會注意到{123;}不是有效的表達式,但只有({123;})。

+3

Dupes:[Oct 2009](http://stackoverflow.com/questions/1635549/in-what-versions-of-c-is-a-block-inside -parenthesis-used-to-return-a-value-valid)[2010年5月](http://stackoverflow.com/questions/2892981/weird-initialization-in-c)[2010年1月](http:// stackoverflow .com/questions/2075930/more-information-on-in-c) – 2010-12-18 00:12:30

回答

16

它不是一個有效的C99或C89和C++。它是gcc擴展名,稱爲「語句表達式」。使用gcc添加選項-ansi -pedantic來驗證C代碼。也有用的選項是-W -Wall -Wextra

文檔for語句表達在這裏http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

這GNU擴展廣泛用於GNU代碼和Linux,所以它不僅得到GCC,而且在現代編譯像英特爾C++編譯器,Sun Studio,LLVM +鐺,...

+1

目前(gcc 4.4.5),對於C,'-ansi'相當於'-std = c89'(和C++的'-std = C++ 98')。其他一些有用的選項是:-std = c99,-std = gnu89,-std = gnu99,-std = C++ 0x,-std = gnu ++ 0x。 – pmg 2010-12-18 00:10:43

+0

@pmg,如果您知道,下一個標準中會包含「語句表達式」嗎? – osgx 2010-12-18 00:12:33

+2

嗯......這個[open-std站點上的PDF](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1229.pdf)提示「語句表達式」成爲標準一段時間。 – pmg 2010-12-18 00:19:37

相關問題