复合语句是否在C中左值(或右值)?

alb*_*bin 4 c compound-assignment

当我container_of在Linux内核中检查宏的定义时,我看到一个复合语句作为宏定义,

#define container_of(ptr, type, member) ({                      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

然而,我脑海中不明确的问题是哪个陈述被视为右值.显然,最后一个语句的结果用作右值,但为什么呢?

(type *)( (char *)__mptr - offsetof(type,member) );
Run Code Online (Sandbox Code Playgroud)

例如,下面的代码示例是否合法?

int g_count = 0xFF;

#define GLOBAL_COUNT do {g_count;} while(0)

int main(int argc, char *argv[])
{
    int local;
    local = GLOBAL_COUNT;
    local = 0;
    GLOBAL_COUNT = local;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

复合语句中变量的赋值规则是什么?

oua*_*uah 8

({})是C的GNU扩展,称为语句表达式:

http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

在C中,复合语句是一个语句,并且语句不能在表达式中使用.