最近我遇到了这段代码。我不知道为什么我在所有的“编码生活”中都没有看到过这种语法。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a的值为10.这种初始化方式究竟是什么?它是如何工作的?
答案 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);
(您可能会分别对如何评估逗号表达式感到困惑。请说明是否属于这种情况。)