可变声明方法
Variable Declaration Methods
我可以猜想这是一个新手问题,但我似乎在某个地方错过了它,而且我是一个新手,所以如果答案很明显,请不要太卑鄙... 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
的类型(假设char1
和char2
都是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_MIN
到INT_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
,则可以使用。第三个带有牙套可防止转化狭窄。
- 将子类方法声明为基类的友元
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- C++ C# 中的方法声明
- 使用gtest将所有方法声明为virtual以进行mocking
- 方法声明 c++ 后的引用符号
- 标题C 中的静态类方法声明
- 接口定义中的方法声明
- 如何在没有显式方法声明的情况下返回值
- C 类方法声明返回错误
- C++ dll 导入 VBA(Excel) 与方法声明"_Something"
- 查找没有定义的方法声明
- 只要调用的函数是用constexpr指定的,就将委托方法声明为constexpr
- mat类opencv中的begin()方法声明
- C++受模板方法声明影响的名称查找
- 我可以在Visual Studio 2012中将方法声明为朋友吗?
- 类中方法声明的顺序是否对编译器很重要
- 静态方法声明但未定义错误c++
- 错误:在类方法声明中无效地使用void表达式
- 奇怪的c++语法方法声明
- 类方法声明中的 decltype:在声明成员之前使用时出错"referenced"