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

问题描述:

最近我遇到了这段代码。我不知道为什么我从未在所有“编码生活”中看到过这种语法。C++中的变量初始化:一种独特的方法

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

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

a的值为10.究竟是什么样的初始化方式被调用?它是如何工作的?

+1

我称之为疯狂 – 2013-03-15 23:53:54

本声明:

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

利用了comma operator的。每一段中的C++ 11标准的5.18/1:

[...] 一对由逗号分隔的表达式求值左到右;左表达式是丢弃值表达式(条款5).83在与右表达式相关联的每个值计算和副作用之前,对与左表达式 相关联的每个值计算和副作用进行排序。 类型和结果的值是右操作数的类型和值;结果与右边的操作数具有相同的值类别 ,如果右边的操作数是glvalue和位域,则结果是位域。如果右边的 操作数的值是临时值(12.2),则结果是临时值。

b = 5; 
int a = b + 5; 

就个人而言,我没有看到这里使用逗号操作符的一个原因:

因此,你的说法是等价的。只需以易读的方式初始化变量,除非您有充分的理由不这样做。

+1

+1为您的最后一段,这只是混淆恕我直言,应尽可能避免(这是,几乎总是)。在我和同事们一起维护的少数几个议会中,我认为没有一个地方会使用逗号运算符,而且我会无耻地对任何敢于犯下这种行为的人造成身体伤害。可读性第一。 – syam 2013-03-16 00:08:51

+0

谢谢你。我在看到这个代码的时候正在进行C++测试。 – FoY 2013-03-16 12:08:37

+0

@Foy:哦,我明白了。无论如何,你都不会在真实世界的应用程序中找到这些代码。如果你这样做,考虑改变它(或建议改变它)成更可读的东西;) – 2013-03-16 12:23:08

初始化被称为复制初始化。如果忽略右边的复杂表情,这是一样的:

int a = 10; 

这是与直接初始化,它看起来像这样进行对比:

int a(10); 

(这是可能的您分别对如何评估逗号表示感到困惑,请注明是否属于这种情况。)

+0

其实我的意思是复杂的表达:)但它是一切都好,它已经回答了。 – 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

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