最近我遇到了这段代码。我不知道为什么在我的“编码生活”中从未见过这种语法。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a 的值为 10。这种初始化方式到底叫什么?它是如何工作的?
最近我遇到了这段代码。我不知道为什么在我的“编码生活”中从未见过这种语法。
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a 的值为 10。这种初始化方式到底叫什么?它是如何工作的?
这个说法:
int a = (b=5, b + 5);
使用逗号运算符。根据 C++11 标准的第 5.18/1 段:
[...]一对用逗号分隔的表达式从左到右计算;左表达式是丢弃的值表达式(第 5 条)。83 与左表达式相关的每个值计算和副作用都在与右表达式相关的每个值计算和副作用之前排序。结果的类型和值是右操作数的类型和值;结果与其右操作数属于相同的值类别,并且如果其右操作数是泛左值和位域,则结果是位域。如果右操作数的值是临时的(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
在表达式中使用时,逗号运算符将评估其所有操作数(从左到右)并返回最后一个。
初始化称为复制初始化。如果忽略右侧的复杂表达式,则与以下相同:
int a = 10;
这与直接初始化形成对比,它看起来像这样:
int a(10);
(您可能分别对如何评估逗号表达式感到困惑。请指出是否是这种情况。)