C++中的变量初始化:一种独特的方法

C++中的变量初始化:一种独特的方法,c++,initialization,C++,Initialization,最近我遇到了这段代码。我不知道为什么在我的编码生涯中从未见过这种语法 int main() { int b; int a = (b=5, b + 5); std::cout << a << std::endl; } a的值为10。这种初始化方式到底叫什么?它是如何工作的?初始化称为复制初始化。如果忽略右侧的复杂表达式,则与中的相同: int a = 10; 这与直接初始化形成对比,后者如下所示: int a(10); 您可能对如何计算逗号表

最近我遇到了这段代码。我不知道为什么在我的编码生涯中从未见过这种语法

int main()
{
    int b;
    int a = (b=5, b + 5);

    std::cout << a << std::endl;
}

a的值为10。这种初始化方式到底叫什么?它是如何工作的?

初始化称为复制初始化。如果忽略右侧的复杂表达式,则与中的相同:

int a = 10;
这与直接初始化形成对比,后者如下所示:

int a(10);

您可能对如何计算逗号表达式的值感到困惑。请指出是否是这种情况。

初始化称为复制初始化。如果忽略右侧的复杂表达式,则与中的相同:

int a = 10;
这与直接初始化形成对比,后者如下所示:

int a(10);
您可能对如何计算逗号表达式的值感到困惑。请指出是否是这种情况。

运算符依次计算参数并返回最后一个值

它不仅可以用于初始化

运算符,还可以逐个计算参数并返回最后一个值

它不仅可用于初始化

此语句:

int a = (b=5, b + 5);
利用。根据C++11标准第5.18/1段:

[…]一对由逗号分隔的表达式从左到右求值;左表达式是一个丢弃的值 表达式第5.83条与左表达式相关的每个值计算和副作用 在与正确表达式关联的每个值计算和副作用之前进行排序。类型 结果的和值是右操作数的类型和值;结果属于同一价值类别 作为其右操作数,如果其右操作数是glvalue和位字段,则为位字段。如果权利的价值 操作数是临时的12.2,结果是临时的

因此,您的声明相当于:

b = 5;
int a = b + 5;
就我个人而言,我认为没有理由在这里使用逗号运算符。只需以易读的方式初始化变量,除非您有充分的理由这样做。

此语句:

int a = (b=5, b + 5);
利用。根据C++11标准第5.18/1段:

[…]一对由逗号分隔的表达式从左到右求值;左表达式是一个丢弃的值 表达式第5.83条与左表达式相关的每个值计算和副作用 在与正确表达式关联的每个值计算和副作用之前进行排序。类型 结果的和值是右操作数的类型和值;结果属于同一价值类别 作为其右操作数,如果其右操作数是glvalue和位字段,则为位字段。如果权利的价值 操作数是临时的12.2,结果是临时的

因此,您的声明相当于:

b = 5;
int a = b + 5;
就我个人而言,我认为没有理由在这里使用逗号运算符。只要以易读的方式初始化变量,除非您有充分的理由这样做。

逗号运算符允许您分隔表达式。发言人的声明

exp1, exp2, ..., expn 
计算为expn

所以首先b被设置为5,然后a被设置为b+5

旁注:因为,在运算符的语义表中具有最低的优先级

int a = b = 5, b+5;
不同于

int a = (b = 5, b+5);
因为第一个被解析为int a=b=5,b+5

逗号,所以运算符允许您分隔表达式。发言人的声明

exp1, exp2, ..., expn 
计算为expn

所以首先b被设置为5,然后a被设置为b+5

旁注:因为,在运算符的语义表中具有最低的优先级

int a = b = 5, b+5;
不同于

int a = (b = 5, b+5);

因为第一个在表达式中使用时被解析为int a=b=5,b+5,所以逗号运算符将从左到右计算其所有操作数并返回最后一个操作数。

在表达式中使用时,逗号运算符将从左到右计算其所有操作数并返回最后一个操作数。

+1对于最后一段,这只是一种混淆,应该尽可能避免,几乎总是这样。在我和同事一起维护的少数MLOC中,我认为没有一个地方使用逗号运算符,我会无耻地伤害任何胆敢犯下这种罪行的人。可读性是第一位的。@FoY:哦,我明白了。无论如何,在现实世界的应用程序中找不到太多这样的代码。如果你这样做,考虑改变它,或者建议把它变成更可读的东西;1对于你的最后一段,这只是混淆,应该尽可能避免,几乎总是这样。在我和同事一起维护的少数MLOC中,我认为没有一个地方使用逗号运算符,我会无耻地伤害任何胆敢犯下这种罪行的人。可读性com
福伊:哦,我明白了。无论如何,在现实世界的应用程序中找不到太多这样的代码。如果你这样做,考虑改变它,或者建议把它变成更可读的东西;我实际上是指复杂的表达:但这都是好的,它已经回答了。我实际上是指复杂的表达:但这都是好的,它已经回答了。