C 指定语句的结果,后跟表达式和分号

C 指定语句的结果,后跟表达式和分号,c,C,对不起,我不能正确命名这些东西,如果可以,我可能不必问。 后一部分可能也是一个语句,因为分号,但它只是一个“a+b”,什么也做不了 我最近看到了这条线索及其公认的答案: 使用此宏: #define max(a,b) \ ({ __typeof__ (a) _a = (a); \ __typeof__ (b) _b = (b); \ _a > _b ? _a : _b; }) 我检查它是为了了解它是如何工作的,也就是说,它是如何产生一些东西的,而这些东西在进行宏观扩展时,可以分配

对不起,我不能正确命名这些东西,如果可以,我可能不必问。 后一部分可能也是一个语句,因为分号,但它只是一个“a+b”,什么也做不了

我最近看到了这条线索及其公认的答案:

使用此宏:

#define max(a,b) \
({ __typeof__ (a) _a = (a); \
   __typeof__ (b) _b = (b); \
 _a > _b ? _a : _b; })
我检查它是为了了解它是如何工作的,也就是说,它是如何产生一些东西的,而这些东西在进行宏观扩展时,可以分配给其他东西的。 因此,这里有一个简单的示例,它编译并执行它似乎是:

int x = ({ int a=5; int b=3; a + b; });
printf( "%i", x );
// output: 8
这到底是为什么/如何工作的,以及为什么编译/工作需要两个大括号对({}?

这是一个问题。它不符合标准,不太可能在大多数编译器中工作。我想它不需要这些括号,但是有了它们会使它在视觉上更加明显,也会减少无意中使用的可能性


默认情况下,GCC允许无任何诊断的非标准扩展-如果您使用say
-std=c11-pedantic编译,您将获得

% gcc -std=c11 -pedantic foo.c
foo.c: In function ‘main’:
foo.c:4:12: warning: ISO C forbids braced-groups within expressions [-Wpedantic]
    int x = ({ int a=5; int b=3; a + b; });
            ^
这是一个很好的例子。它不符合标准,不太可能在大多数编译器中工作。我想它不需要这些括号,但是有了它们会使它在视觉上更加明显,也会减少无意中使用的可能性


默认情况下,GCC允许无任何诊断的非标准扩展-如果您使用say
-std=c11-pedantic编译,您将获得

% gcc -std=c11 -pedantic foo.c
foo.c: In function ‘main’:
foo.c:4:12: warning: ISO C forbids braced-groups within expressions [-Wpedantic]
    int x = ({ int a=5; int b=3; a + b; });
            ^

这是一个GCC特性,称为。这不是标准C的一部分

它按照您推断的方式工作-表达式中的代码运行,然后表达式计算为其中最后一条语句的值


({
})
是必要的,因为这是GCC的创建者决定的-可能是为了不可能与其他任何东西混淆。

这是一个称为。这不是标准C的一部分

它按照您推断的方式工作-表达式中的代码运行,然后表达式计算为其中最后一条语句的值

({
})
是必要的,因为这是GCC的创建者决定的-可能是为了不可能与其他任何东西混淆。

这是所谓的,不符合标准

回想一下,C有语句和表达式。语句做事情时不产生值,而表达式总是在最后产生值

C允许从一开始就将表达式用作语句。但是,没有语法将语句转换为表达式

GCC扩展恢复了对称性:当您将大括号括在括号中,并且在语句块末尾有一个表达式时,GCC将其视为有效表达式。这个技巧允许您在语句中进行声明,但是您可以将任何其他表达式放在大括号中,例如

int x = ({
    int i = 0;
    for (int j = 0 ; j != 6 ; j++) {
        i += j;
    }
    i; // <<== This expression serves as a "return" for the statement
});
printf("%d\n", x);
intx=({
int i=0;
对于(int j=0;j!=6;j++){
i+=j;
}
i、 //这是一种所谓的,不符合标准的方法

回想一下,C有语句和表达式。语句做事情时不产生值,而表达式总是在最后产生值

C允许从一开始就将表达式用作语句。但是,没有语法将语句转换为表达式

GCC扩展恢复了对称性:当您将大括号括在括号中,并且在语句块末尾有一个表达式时,GCC将其视为有效表达式。此技巧允许您在语句中声明,但您可以将任何其他表达式放在大括号中,例如

int x = ({
    int i = 0;
    for (int j = 0 ; j != 6 ; j++) {
        i += j;
    }
    i; // <<== This expression serves as a "return" for the statement
});
printf("%d\n", x);
intx=({
int i=0;
对于(int j=0;j!=6;j++){
i+=j;
}

我可能的重复的副本。也可以是相关的:考虑删除过时的、非标准的代码>代码> <代码> >标准C >代码>泛型< /代码>可能的副本的重复副本。好的,GCC专业,现在看起来不那么令人困惑了。那太快了!好的,GCC专业,现在看起来不那么令人困惑了。