可变声明方法

Variable Declaration Methods

本文关键字:方法 声明      更新时间:2023-10-16

我可以猜想这是一个新手问题,但我似乎在某个地方错过了它,而且我是一个新手,所以如果答案很明显,请不要太卑鄙... p>我看到变量声明了多种方式:

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

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

unsigned char sum{ char1 + char2 };

我有一个错误:错误1错误C2398:元素'1':从" int"转换为"无符号char&'"需要缩小转换。

,但我没有得到以下错误:

unsigned char sum(char1 + char2);

因此,有人可以解释声明之间的区别或提供将要链接的链接?

谢谢...

tl; dr:当您添加两个char s时,您将获得int,并且Brace初始化有意取消此类作业。

c ,与C保持一致,可以进行整数促进;因此,表达式char1 + char2的类型(假设char1char2都是char类型)不是人们所期望的char,而是int。标准的相关部分是§4.5(描述了Integralal 促销),§4.13(Integralal 转换)和§5.7(促进积分促销)。

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

当然,最后,您可能想停下来问自己:"无论如何添加两个字符到底意味着什么?"


*对于有兴趣的人来说,C 说int足够大至少以INT_MININT_MAX(§3.9.2)(§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值得注意的是,实际上并未在实施中强加签名整数的两个组合表示。

如果value不是DataType,并且该CTOR作为explicit将其写入,则无法使用您的第一个示例。第二个将尝试使用参数value调用CTOR,但如果是explicit,则可以使用。第三个带有牙套可防止转化狭窄。