【发布时间】:2013-03-16 07:54:05
【问题描述】:
最近我遇到了这段代码。我不知道为什么在我的“编码生活”中从未见过这种语法。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a 的值为 10。这种初始化方式到底叫什么?它是如何工作的?
【问题讨论】:
标签: c++ initialization
最近我遇到了这段代码。我不知道为什么在我的“编码生活”中从未见过这种语法。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a 的值为 10。这种初始化方式到底叫什么?它是如何工作的?
【问题讨论】:
标签: c++ initialization
此声明:
int a = (b=5, b + 5);
使用comma operator。根据 C++11 标准的第 5.18/1 段:
[...] 一对用逗号分隔的表达式从左到右计算;左边的表达式是一个丢弃的值 表达式(第 5 条).83 与左表达式相关的每个值计算和副作用 在与正确表达式相关的每个值计算和副作用之前排序。 类型 结果的和值是右操作数的类型和值;结果是相同的值类别 作为它的右操作数,并且如果它的右操作数是一个左值和一个位域,则它是一个位域。如果正确的值 操作数是临时的(12.2),结果是临时的。
因此,您的语句相当于:
b = 5;
int a = b + 5;
就个人而言,我看不出这里使用逗号运算符的原因。只需以易于阅读的方式初始化您的变量,除非您有充分的理由不这样做。
【讨论】:
operator , 依次计算参数并返回最后一个值
它不仅可以用于初始化
【讨论】:
逗号, 运算符允许您分隔表达式。由
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
【讨论】:
在表达式中使用时,逗号运算符将计算其所有操作数(从左到右)并返回最后一个。
【讨论】:
初始化称为复制初始化。如果忽略右边的复杂表达式,则与中相同:
int a = 10;
这与直接初始化形成对比,看起来像这样:
int a(10);
(您可能分别对如何评估逗号表达式感到困惑。请指出是否是这种情况。)
【讨论】: