2011-08-19 9 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; })構築物がありませんさ最後の式の値を評価しますか?具体的に、どのようなこの構造の解析ツリーが見えますか?私は{ }は常に複合文を意味考え、およびステートメントは値を持ちません。私はのCの文法の周り掘ってみました、まだこの問題を見つけ出すことができませんでした。

+0

'42;'も同様です:-) – paxdiablo

+1

ああ、私は、OPは「42;」がスタンダードCのステートメントであるためステートメントであると知っていると思っています。しかし、標準Cではそうではありません。 –

答えて

10

Statement ExpressionsというGCC拡張です。それは標準ではありません。

+0

ステートメントの式ですか?頭痛のように聞こえる。 – BoltClock

+0

ありがとう!もちろん、私は実際に "typeofキーワードと、括弧内に複合文を入れる構文は、普及しているGNU Cコンパイラ(GCC)に実装されている非標準の拡張です"おっとっと。 –

+0

私はそれらが好きです。彼らはこのようなインテリジェントなことを可能にします。 :) – balki

関連する問題