abj*_*shi 0 c compiler-warnings sequence-points
使用的编译器:gcc 8.2
命令行:-Wall
我目前对序列点违规的理解是代码在某种程度上取决于给定表达式中操作数/子表达式的求值顺序。之所以如此,是因为表达式中操作数的求值顺序未指定,如此处所述。因此,代码如下:
a = 5;
b = a + ++a;
Run Code Online (Sandbox Code Playgroud)
是一种违规并被-Wsequence-point捕获,因为结果存在歧义,即应该是 (5 + 6) 还是 (6 + 6) ?我认为下面的代码中存在类似的歧义,因为我们无法知道第二个 ++a 是否会在第一个之前被评估:
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
int use()
{
int min;
int a = 4, b = 5;
min = MIN(++a, b);
//min = ((++a) < b) ? (++a) : b;
return min;
}
Run Code Online (Sandbox Code Playgroud)
我显然错过了一些东西,因为这段代码没有在-Wseqeuence-point上警告我。有人可以帮我理解什么吗?请注意,我特意按原样定义了 MIN。
根据 ISO C11 标准,在三元/条件运算符谓词的求值与其任一替代项(无论对哪个进行求值)之间存在一个序列点。因此,两者++a通过插入的序列点相对于彼此进行排序。
\n\n\xc2\xa76.5.15 条件运算符
\n\n句法
\n\n1.
\n\nRun Code Online (Sandbox Code Playgroud)\n\nconditional-expression:\n logical-OR-expression\n logical-OR-expression ? expression : conditional-expression\n[...]
\n\n语义学
\n\n\n
\n- 第一个操作数被求值;在它的求值和第二个或第三个操作数的求值(以被求值者为准)之间有一个序列点。仅当第一个操作数与 0 比较时不等于 0 时,才会计算第二个操作数;仅当第一个操作数等于 0 时才计算第三个操作数;结果是第二个或第三个操作数(以计算结果为准)的值,转换为下面描述的类型。
\n
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |