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如果你说的“编辑”是指完全重写?当然可以:)