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

时间:2013-03-15 23:43:51

标签: c++ initialization

最近我遇到了这段代码。我不知道为什么我在所有的“编码生活”中都没有看到过这种语法。

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

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

a的值为10.这种初始化方式究竟是什么?它是如何工作的?

5 个答案:

答案 0 :(得分:6)

本声明:

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

使用comma operator。根据C ++ 11标准的第5.18 / 1段:

  

[...] 用逗号分隔的一对表达式从左到右评估;左表达式是丢弃的值   表达式(第5条).83与左表达式相关的每个值计算和副作用   在每个值计算和与右表达式相关的副作用之前进行排序。 类型   和结果的值是右操作数的类型和值;结果具有相同的值类别   作为右操作数,如果右操作数是glvalue和bit-field,则是一个位字段。如果值合适   操作数是临时的(12.2),结果是暂时的。

因此,您的陈述相当于:

b = 5;
int a = b + 5;

就个人而言,我没有看到在这里使用逗号运算符的原因。只需以易读的方式初始化变量,除非您有充分的理由不这样做。

答案 1 :(得分:4)

operator ,一个接一个地计算参数并返回最后一个值

它不仅可以用于初始化

答案 2 :(得分:3)

逗号,运算符允许您分隔表达式。

所作的补偿声明
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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

int a = 10;

这与直接初始化形成对比,如下所示:

int a(10);

(您可能会分别对如何评估逗号表达式感到困惑。请说明是否属于这种情况。)