第2章 变量和基本类型
基本内置类型(Primitive Built-in Types)
算数类型(Arithmetic Types)
算数类型分为两类:整型(integral type)、浮点型(floating-point type)。
bool
类型的取值是true
或false
。
一个char
的大小和一个机器字节一样,确保可以存放机器基本字符集中任意字符对应的数字值。wchar_t
确保可以存放机器最大扩展字符集中的任意一个字符。
在整型类型大小方面,C++规定short
≤ int
≤ long
≤ long long
(long long
是C++11定义的类型)。
浮点型可表示单精度(single-precision)、双精度(double-precision)和扩展精度(extended-precision)值,分别对应float
、double
和long double
类型。
除去布尔型和扩展字符型,其他整型可以分为带符号(signed)和无符号(unsigned)两种。带符号类型可以表示正数、负数和0,无符号类型只能表示大于等于0的数值。类型int
、short
、long
和long long
都是带符号的,在类型名前面添加unsigned
可以得到对应的无符号类型,如unsigned int
。
字符型分为char
、signed char
和unsigned char
三种,但是表现形式只有带符号和无符号两种。类型char
和signed char
并不一样, char
的具体形式由编译器(compiler)决定。
如何选择算数类型:
-
当明确知晓数值不可能为负时,应该使用无符号类型。
-
使用
int
执行整数运算,如果数值超过了int
的表示范围,应该使用long long
类型。 -
在算数表达式中不要使用
char
和bool
类型。如果需要使用一个不大的整数,应该明确指定它的类型是signed char
还是unsigned char
。 -
执行浮点数运算时建议使用
double
类型。
类型转换(Type Conversions)
进行类型转换时,类型所能表示的值的范围决定了转换的过程。
- 把非布尔类型的算术值赋给布尔类型时,初始值为0则结果为
false
,否则结果为true
。 - 把布尔值赋给非布尔类型时,初始值为
false
则结果为0,初始值为true
则结果为1。 - 把浮点数赋给整数类型时,进行近似处理,结果值仅保留浮点数中的整数部分。
- 把整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
- 赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数(8比特大小的
unsigned char
能表示的数值总数是256)取模后的余数。 - 赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。
避免无法预知和依赖于实现环境的行为。
无符号数不会小于0这一事实关系到循环的写法。
// WRONG: u can never be less than 0; the condition will always succeed
for (unsigned u = 10; u >= 0; --u)
std::cout << u << std::endl;
当u等于0时,--u的结果将会是4294967295。一种解决办法是用while
语句来代替for
语句,前者可以在输出变量前先减去1。
unsigned u = 11; // start the loop one past the first element we want to print
while (u > 0)
{
--u; // decrement first, so that the last iteration will print 0
std::cout << u << std::endl;
}
不要混用带符号类型和无符号类型。
字面值常量(Literals)
以0
开头的整数代表八进制(octal)数,以0x
或0X
开头的整数代表十六进制(hexadecimal)数。在C++14中,0b
或0B
开头的整数代表二进制(binary)数。
整型字面值具体的数据类型由它的值和符号决定。
C++14新增了单引号'
形式的数字分隔符。数字分隔符不会影响数字的值,但可以通过分隔符将数字分组,使数值读写更容易。
// 按照书写形式,每3位分为一组
std::cout << 0B1'101; // 输出"13"
std::cout << 1'100'000; // 输出"1100000"
浮点型字面值默认是一个double
。
由单引号括起来的一个字符称为char
型字面值,双引号括起来的零个或多个字符称为字符串字面值。
字符串字面值的类型是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符'\0'
,因此字符串字面值的实际长度要比它的内容多一位。
转义序列:
含义 | 转义字符 |
---|---|
newline | \n |
horizontal tab | \t |
alert (bell) | \a |
vertical tab | \v |
backspace | \b |
double quote | \" |
backslash | \\ |
question mark | \? |
single quote | \' |
carriage return | \r |
formfeed | \f |
std::cout <&l