C++中的变量初始化:一种独特的方法
最近我遇到了这段代码。我不知道为什么我从未在所有“编码生活”中看到过这种语法。C++中的变量初始化:一种独特的方法
int main()
{
int b;
int a = (b=5, b + 5);
std::cout << a << std::endl;
}
a的值为10.究竟是什么样的初始化方式被调用?它是如何工作的?
本声明:
int a = (b=5, b + 5);
利用了comma operator的。每一段中的C++ 11标准的5.18/1:
[...] 一对由逗号分隔的表达式求值左到右;左表达式是丢弃值表达式(条款5).83在与右表达式相关联的每个值计算和副作用之前,对与左表达式 相关联的每个值计算和副作用进行排序。 类型和结果的值是右操作数的类型和值;结果与右边的操作数具有相同的值类别 ,如果右边的操作数是glvalue和位域,则结果是位域。如果右边的 操作数的值是临时值(12.2),则结果是临时值。
b = 5; int a = b + 5;
就个人而言,我没有看到这里使用逗号操作符的一个原因:
因此,你的说法是等价的。只需以易读的方式初始化变量,除非您有充分的理由不这样做。
初始化被称为复制初始化。如果忽略右边的复杂表情,这是一样的:
int a = 10;
这是与直接初始化,它看起来像这样进行对比:
int a(10);
(这是可能的您分别对如何评估逗号表示感到困惑,请注明是否属于这种情况。)
其实我的意思是复杂的表达:)但它是一切都好,它已经回答了。 – FoY 2013-03-16 12:17:57
运营商,
评估a rguments此起彼伏,并返回一个值
它可以用于不仅在初始化
逗号,
运算符允许您分隔表达式。
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
在表达式中使用时,逗号运算符将评估其所有操作时代(从左到右)并返回最后一个。
我称之为疯狂 – 2013-03-15 23:53:54