C++ 逗号分隔变量定义中关系之前的序列

C++ 逗号分隔变量定义中关系之前的序列,c++,operator-precedence,C++,Operator Precedence,让我们从以下示例代码开始: inta=0,b=a++,c=a a++是否在a之前排序(在c=a中)a++和a似乎符合完整表达式的条件,根据(规则1),答案应该是肯定的。但我不确定。是的。正如所指出的,这不是一个逗号运算符,而是一个init声明器列表。从[dcl.decl]开始,我们有: 声明中的每个init声明器都被单独分析,就像它自己在声明中一样 在脚注中澄清: 具有多个声明器的声明通常相当于具有单个声明器的相应声明序列 声明人。就是 T D1, D2, ... Dn; 通常相当于 T D1

让我们从以下示例代码开始:

inta=0,b=a++,c=a

a++
是否在
a
之前排序(在
c=a
中)
a++
a
似乎符合完整表达式的条件,根据(规则1),答案应该是肯定的。但我不确定。

是的。正如所指出的,这不是一个逗号运算符,而是一个init声明器列表。从[dcl.decl]开始,我们有:

声明中的每个init声明器都被单独分析,就像它自己在声明中一样

在脚注中澄清:

具有多个声明器的声明通常相当于具有单个声明器的相应声明序列 声明人。就是

T D1, D2, ... Dn;
通常相当于

T D1; T D2; ... T Dn;
其中,
T
是一个decl说明符seq,而每个
Di
是一个init声明符

有两个例外,一个是隐藏类型的名称,另一个是
auto
,两者都不适用。因此,最终,您拥有的代码完全等同于:

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

您应该首先编写它,因为它不需要通过搜索标准来确保您所做的事情是有效的

你有没有试过,看看会发生什么?或者您是否担心不同的编译器可能会给出不同的结果?@Chris尝试一下,看看会发生什么,这不是确定是否有UB的好方法。声明中的逗号分隔声明符不是逗号运算符。@Brian Hm。声明符算作完整表达式吗?是的,请参见[dcl.decl]/3:“声明中的每个init声明器都被单独分析,就像它自己在声明中一样。“脚注澄清,这种声明是按适当顺序审议的。这对OP的回答是肯定的。我本来打算写一个答案,但我想你可以编辑你的答案。@Brian如果你说的“编辑”是指完全重写?当然可以:)