简单变量
1 | int num; |
程序将找到一块能够存储整数的内存,将该内存单元标记为num
,并将5复制到该内存单元中;然后,可在程序中使用num
来访问该内存单元
C++还有另一种C语言没有的初始化语法
1 | int num(5); |
这些变量都是声明了类型了,计算机如何知道没有声明类型的常量,比如
1 | cout << "Year = " << 1492 << "\n"; |
除非有理由存储为其他类型,否则 C++ 将整型常量存储为 int 类型,这里的其他理由是指
- 使用了特殊的后缀来表示特定的类型
- 太大,不能存储为
int
const
首先来看 #define
符号常量–预处理方式
1 |
在C++编译过程中,首先将源代码传递给预处理器。在这里,#define
和#include
一样,是一个预处理器编译指令。告诉预处理器:在程序中查找INT_MAX
,并将所有的 INT_MAX
都替换为32767
const
比 #define
好。
const
能够明确指定类型。- 可以使用C++的作用域规则将定义限制在特定的函数或文件中
- 可以将
const
用于更复杂的类型,比如数组或者结构
d.dddE+n
指的是将小数点向右移n位
d.dddE~n
指的是将小数点向左移n位,8.33E~4
表示8.33/10^4
,即0.000833
类型转换
转换 | 潜在的问题 |
---|---|
将较大的浮点类型转换为娇小的浮点类型,如将 double 转换为 float |
精度(有效数位)降低,值可能超出目标类型的 取值范围,在这种情况下,结果将是不确定的 |
将浮点类型转换为整型 | 小数部分丢失,原来的值可能超出目标类型的取 值范围,在这种情况下,结果将是不确定的 |
将较大的整型转换为较小的整 型,如将long 转换为short |
原来的值可能超出目标类型的取值范围,通常只 复制右边的字节 |
将 0 赋给bool
变量时,将被转换为false
;而非零值将被转换为true
。
C++11制定了校验关系
- 如果有一个操作数的类型是
long double
,则将另一个操作数转换为long double
- 如果有一个操作数的类型是
long double
,则将另一个操作数转换为long double
- 否则,如果有一个操作数的类型是
float
,则将另一个操作数转换为float
- 否则,说明操作数都是整型,因此执行整型提升
- 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
- 如果一个操作数为有符号的,另一个操作数为无符号的,且 无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符 号操作数所属的类型
- 否则,如果有符号类型可表示无符号类型的所有可能取值, 则将无符号操作数转换为有符号操作数所属的类型。
- 否则,将两个操作数都转换为有符号类型的无符号版本。
也可以{ }
方式初始化时进行的转换
1 | int ch(77); |
强制类型转换不会修改变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值,常见的转换表达式如下
1 | (typeName) var |
C++还引入了4个强制类型转换运算符
1 | int ch(77); |
auto
C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。为此,它重新定义了auto的含义
1 |
|
输出结果
1 | Type of num: i |
总结
C++的基本类型分为两组:
-
由存储为整数的值组成,整型之间通过存储值时使用的内存量及有无符号来区分,从最小到最大依次是:
bool
、char
、signed char
、unsigned char
、short
、unsigned short
、int
、unsigned int
、long
、unsigned long
以及 -
由存储为浮点格式的值组成。分别是
float
、double
和long double
。
C11新增了
long long
和unsigned long long
,还有一种wchar_t
类型,它在这个序列中的位置取决于实现。C11新增了类型char16_t
和char32_t
,分别存储16和32位的字符编码
参考链接
- 《C++ Primer Plus》