2011-08-19 55 views
5

在閱讀http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects時,我遇到了這個例子:C塊變爲表達式:({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; })是如何構造的評估爲last-expression的值?具體來說,這個結構的解析樹是什麼樣的?我認爲{ }總是表示複合語句,而語句沒有值。我嘗試用 C語法進行挖掘,仍然無法解決這個問題。

+0

'42;'也是一個聲明:-) – paxdiablo

+1

啊,但我懷疑OP知道'42;'是一個語句,因爲它是標準C語句。語句表達式是不是在標準C中,但是。 –

回答

10

這是一個名爲Statement Expressions的GCC擴展。這不是標準C.

+0

語句表達式?!聽起來很頭疼。 – BoltClock

+0

謝謝!當然,我實際上應該閱讀「typeof關鍵字和在圓括號內放置複合語句的構造,都是在流行的GNU C編譯器(GCC)中實現的非標準擴展。」哎呀。 –

+0

我喜歡他們。他們允許做這樣聰明的事情。 :) – balki

相關問題