变量声明方法

时间:2014-01-30 05:40:13

标签: c++ variables

我可以猜到这是一个新手问题,但我似乎错过了某个地方,加上我是新手,所以如果答案显而易见,那就不太吝啬......

我看到变量以多种方式声明:

DataType varName = value;
DataType varName(value);
DataType varName{value};

我认为这是作家选择情况之一,但最近我试图添加2个char变量并将其设置为另一个char变量,我使用了大括号版本:

unsigned char sum{ char1 + char2 };

我收到一个错误: 错误1错误C2398:元素'1':从'int'转换为'unsigned char&'需要缩小转换。

但我没有得到错误:

unsigned char sum(char1 + char2);

那么有人可以解释一下声明之间的区别,或者提供一个链接到一个网站吗?

...谢谢

2 个答案:

答案 0 :(得分:1)

TL; DR:当你添加两个char时,你得到一个int,并且大括号初始化故意不允许这样的分配。

C ++,与C一致,执行整数提升以进行添加;因此,表达式char1 + char2(假设char1char2都属于char类型)的类型不是人们所期望的char,而是而是int。标准的相关部分是§4.5(描述了积分促销),§4.13(积分转换)和§5.7(附加运算符,它们引起整体推广)。

至于为什么这导致语句unsigned char sum {char1 + char2};失败,大括号初始化专门用于帮助阻止程序员执行缩小转换(第8.5.3节),这可能导致溢出。因为int的大小至少是char的两倍(在八位字节可寻址的机器上*),这是一个缩小的转换,因此失败。

当然,最后,你可能想停下来问问自己,“无论如何,添加两个角色究竟是什么意思?”


*对于感兴趣的人来说,C ++表示int足够大,至少可以保存INT_MININT_MAX(§3.9.2)的值,并将这些宏的定义委托给C(§18.3.3.2),它们(附件E,§1)的最小值分别为-32767和+32767 **。因此,int需要至少16位。另一方面,char至少为8位宽。 C还将char定义为一个字节宽(§6.2.5.3,§5.2.1),其中一个字节(§3.6)是一个“可寻址的数据存储单元,其大小足以容纳基本字符的任何成员执行环境的集合。“严格地说,我认为char可以通过这个定义大于而不是一个字节,但我很确定它不能比任何其他类型更宽。

**那是-32767,而不是-32768。实际上,C实际上并没有对实现的有符号整数强加二进制补码表示。

答案 1 :(得分:0)

如果value不是DataType并且ctor被写为explicit,则无法使用您的第一个示例。第二个将尝试使用参数value调用ctor,但如果它是explicit则会有效。第三个是括号,可以防止缩小转换次数。