变量列表中的逗号是序列点吗?

问题描述 投票:0回答:3

在以下类型的代码中,每个变量构造之间是否存在序列点,或者结果未定义?

int a = 0;
int b = a++, c = a++;

我无法在标准中找到对此处序列点的具体引用。这是否意味着它未定义,或者只是我的搜索失败了?表达式的完成是一个序列点,但是上面的初始化也算吗?

c++ variables comma-operator sequence-points
3个回答
27
投票

我相信行为是明确定义的,因为 8[dcl.decl]/3

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

这甚至在脚注中进一步解释为

具有多个声明符的声明通常等效于每个声明符具有一个声明的相应序列 声明者。那就是

T D1, D2, ... Dn;

通常相当于

T D1; T D2; ... T Dn;

10
投票

正如您怀疑每个初始化表达式后面都有一个序列点,因为它们是完整表达式(1.9/16、1.9/12)。


0
投票

上面的答案似乎与C++有关。只是为了确认,对于 C,ISO/IEC 9899:TC3 委员会草案(2007 年 9 月 7 日)附录 C 表示:

The following are the sequence points described in 5.1.2.3: [...]
— The end of a full declarator: declarators (6.7.5);
— The end of a full expression: an initializer (6.7.8); [...]

所以答案是一样的:

每个初始化表达式后面都有一个序列点,因为它们是完整表达式

© www.soinside.com 2019 - 2024. All rights reserved.