相关疑难解决方法(0)

定义 int a = 0, b = a++, c = a++; 在 C 中定义了行为吗?

C 中的定义是否int a = 0, b = a++, c = a++;定义了行为?

或者几乎等价地,对象定义中的逗号是否像表达式中的逗号运算符一样引入序列点?

对于 C++ 也提出了类似的问题:

C++ 被广泛接受的答案是“是”,它在 C++11 标准第 8/3 段中有完整定义:

声明中的每个初始化声明符都会被单独分析,就像它本身在声明中一样

尽管本段仅涉及语法分析阶段,对于运行时的操作顺序还不够精确。

C语言的情况如何?C 标准是否定义了行为?

之前也有人问过类似的问题:

多个对象声明中的逗号是否会像逗号运算符一样引入序列点?

然而,答案似乎专门针对 C11 草案,并且可能不适用于 C 标准的最新版本,因为自 C11 草案以来,信息性附录 C 的措辞已发生变化,并且似乎也不与标准文本完全一致。

编辑:当然这样的初始化器似乎毫无用处地扭曲。我绝对不会容忍这样的编程风格和结构。这个问题源于关于一个琐碎定义的讨论:int res = 0, a = res;行为似乎没有完全定义(!)。具有副作用的初始化器并不少见,例如考虑以下一个:int arg1 = pop(), arg2 = pop();

c undefined-behavior sequence-points language-lawyer c17

33
推荐指数
2
解决办法
2799
查看次数

当 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
查看次数