Блок C становится выражением: ({int a = 1; int b = 2; a + b;}) равно 3 - PullRequest
5 голосов
/ 19 августа 2011

При чтении http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects, я натолкнулся на этот пример:

\#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 и все еще не мог понять эту проблему.

1 Ответ

10 голосов
/ 19 августа 2011

Это расширение GCC, которое называется Выражения операторов . Это не стандартная С.

...