C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 2(一)

2015-01-27 06:14:56 · 作者: · 浏览: 36
Chapter 2.1
1. 数据类型决定了程序中数据和操作的意义。
?
2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型。算术类型包含了字符、整型、布尔值以及浮点数。void无值也无操作,我们不能定义一个void类型的变量。
?
3. 算术类型的尺寸,也就是该类型所占的比特数,在不同机器上有所差别。下表列出了C++标准规定的最小尺寸,同时允许编译器赋予这些类型更大的尺寸:
?
?
?
由于比特数的不同,一个类型所能表达的最大(最小)值也是不同的。
?
4. C++语言规定,一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。
?
5. 基本字符类型是char,一个char的尺寸应确保可以存放机器基本字符集中任意字符对应的数字值,也就是说,一个char的尺寸和一个机器字节相同。
?
6. 其他字符类型,如wchar_t、char16_t、char32_t用于扩展字符集。wchar_t类型确保可以存放机器最大扩展字符集中的任意一个字符。char16_t和char32_t用于Unicode字符集(Unicode是用于表示所有自然语言中字符的标准)。
?
7. 计算机以比特序列存储数据。大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为“字节”。在C++语言中,一个字节要至少能容纳机器基本字符集中的字符。存储的基本单元称为“字”,通常由几个字节组成。大多数机器的字节由8比特构成,字则由32比特或64比特构成。
?
8. 大多数计算机将内存中的每个字节与一个数字(被称为地址)关联起来。我们能够使用某个地址来表示从这个地址开始的大小不同的比特串。为了赋予内存中某个地址明确的含义,必须首先知道存储在该地址的数据的类型。类型决定了数据所占的比特数以及该如何解释这些比特的内容。
?
9. 除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的和无符号的。字符型与其他整型不同,被分为三种:char、unsigned char和signed char。尽管有三种,但是其表现形式仍就只有两种:带符号的和无符号的。类型char会表现为signed char还是unsigned char是由编译器决定的。
?
10. 无符号类型中所有比特都用来存储值。对于有符号类型,C++标准并没有规定应如何表示,但是约定了在表示范围内正值和负值应该均匀分布。
?
11. 下面是选择使用哪种类型的一些有用的准则:?
?
(1). 当明确知晓数值不可能为负时,选用无符号类型
(2). 使用int来执行整数运算。short通常太小了而long一般和int的尺寸一样。如果数值超出int的表示范围,就使用long long
(3). 在算术表达式中不要使用char或bool。只有在存放字符或布尔值时才使用它们。因为char在一些机器上是有符号的,而在另一些机器上却是无符号的,所以如果使用char进行运算特别容易出问题。如果你需要一个不大的整数,就显示指定为signed char或unsigned char
(4). 选用double来执行浮点运算。float的精度通常不够,并且双精度浮点和单精度浮点的计算在性能开销上相差无几。事实上,在一些机器上,双精度运算甚至比单精度还快。long double提供的精度通常是没有必要的,并且它带来的性能开销也不容忽视
12. 当在程序的某处我们使用了一种类型而对象应该取另一种类型时,程序会自动进行类型转换:
?
bool b = 42; ? ? ? ? ? ? // b为真
int i = b; ? ? ? ? ? ? ? // i的值为1
i = 3.14; ? ? ? ? ? ? ? ?// i的值为3
double pi = i; ? ? ? ? ? // pi的值为3.0
unsigned char c = -1; ? ?// 假设char占8比特,c的值为255
signed char c2 = 256; ? ?// 假设char占8比特,c2的值是未定义的
类型所能表示的值的范围决定了转换的过程:
?
(1). 当我们把一个非布尔算术类型赋值给一个布尔类型对象时,如果值是0,则结果为false,否则结果为true
(2). 当我们把一个布尔类型赋值给其他算术类型时,如果布尔值为true,那么结果就是1,否则结果就是0
(3). 当我们把浮点类型赋值给整型对象时,值会被截断。只会保留小数点之前的值
(4). 当我们把整型类型赋值给浮点型对象时,小数部分将是0。如果该整数的比特数超过了浮点对象可以容纳的比特数的话,精度可能会丢失
(5). 当我们给无符号类型赋值一个超出它表示范围的数值时,结果是该值对无符号类型能够表示的数值的总数取模后的余数。例如,8比特大小的unsigned char可以表示0到255,总共256个数。因此,把-1赋值给它所得的结果是255
(6). 当我们给带符号类型赋一个超出它表示范围的值时,结果是未定义的
13. 如果表达式里既有带符号类型又有无符号类型,带符号数会自动地转换成无符号数。
?
14. 一个形如42的值被称为字面值常量。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
?
15. 我们可以将整型字面值写作十进制数、八进制数或十六进制数的形式:
?
20 ? ? // 十进制
024 ? ?// 八进制,以0开头
0x14 ? // 十六进制,以0x或0X开头
默认情况下,十进制字面值是带符号数,它的类型是int、long和long long中能容纳字面值数值的尺寸最小的那个。而八进制和十六进制字面值既可能是带符号的也可能是无符号的,它的类型是int、unsigned int、long、unsigned long、long long和unsigned long long中能容纳字面值数值的尺寸最小的那个。尽管整型字面值可以存储在带符号类型中,但技术上来说,十进制字面值不会是负数。如果我们写-42,那么负号其实不是字面值的一部分,它只是一个操作符,作用是对字面值取负。
浮点型字面值表现为一个小数或以科学计数法表示的指数:
3.14159
3.14159E0
0.
0e0
.001
默认情况下,浮点型字面值是一个double。
?
16. 由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。编译器会在每个字符串型字面值的结尾处添加一个空字符('\0'),因此,字符串型字面值的实际长度要比它的内容多1。如果两个字符串型字面值位置紧邻并且仅由空格、缩进和换行符分隔,那么它们实际上是一个整体:
?
std::cout << "一个很长很长很长很长再长一点的字符串 " ? ? ? ?
? ? ? ? ? ? ?"跨越了两行噢" << std::endl;
17. C++语言规定的转义序列包括:
?
?
?
我们也可以使用泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字。其值表示的是字符对应的数值。
?
18. 我们可以通过下表中所列的前缀和后缀,来改变整型、浮点