相关疑难解决方法(0)

ANSI C中的parens表达式包含复合语句(块)吗?

浏览Linux内核源代码时,我发现了一段代码,其中括号括起来的语句块被视为表达式a laisp(或ML),即表达式,其值是最后一个语句的值.

例如:

int a = ({
    int i;
    int t = 1;
    for (i = 2; i<5; i++) {
        t*=i;
    }
    t;
});
Run Code Online (Sandbox Code Playgroud)

我一直在研究ANSI C语法,试图弄清楚这段代码如何适合解析树,但我还没有成功.

那么,有没有人知道这种行为是由标准规定还是只是GCC的特殊性?

更新:我已尝试使用标志-pedantic,编译器现在给我一个警告:

warning: ISO C forbids braced-groups within expressions
Run Code Online (Sandbox Code Playgroud)

c standards gcc expression

37
推荐指数
2
解决办法
7507
查看次数

当 a 是代码块时使用逗号运算符 (a, b)

#include <stdio.h>

int main()
{
    int sum = 0, result = (({for (int i = 0; i < 5; i++) sum += i;}), sum);
    
    printf("result = %d\n", result);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显示

result = 10
Run Code Online (Sandbox Code Playgroud)

我正在使用 gcc 中 C 的默认版本。它特定于 gcc 吗?我知道(a, b)回报b,但我没想到它会在阻塞时发挥a作用{}。谁能解释它为什么起作用以及为什么必须将块括起来才能使其起作用?

#define编辑:这是我正在尝试的一个人为的简化示例。一些程序员的评论(谢谢)澄清了这一点。案件结案。

c gcc gcc-statement-expression

4
推荐指数
1
解决办法
165
查看次数

标签 统计

c ×2

gcc ×2

expression ×1

gcc-statement-expression ×1

standards ×1