C++Primer第五版习题答案详解(二)
第2章 变量和基本类型
练习2.1
int最小尺寸为16位, 2个字节; long最小尺寸为32位, 4个字节; long long最小尺寸为64位, 8个字节; short最小尺寸为16位, 2个字节;
带符号类型可以表示整数、负数和0, 无符号类型仅能表示大于等于0的值且所有比特都用来存储值;
float和double都是浮点类型, float最小尺寸为6位有效数字, double为10位;
练习2.2
利率:unsigned double; 本金和付款:unsigned float
利率一般小数位数较多, 且没有负数; 本金和付款小数位数少, 也没有负数; unsigned可以节约字节数
练习2.3
1 |
|
这一段产生逸出, 输出结果为4294967264, 无符号数相减可以得到0;
假设int占32位, unsigned类型中 -1 对应4294967295 2的32次方为4294967296
练习2.5
(a) ‘a’ 字符字面值, L’a’ 宽字符字面值, 类型是wchar_t, “a” 字符串字面值, L"a" 宽字符字符串字面值;
(b)10 十进制, 10u 无符号整型, 10L 长整型, 10uL 无符号长整型, 012 八进制, 0xC 十六进制;
©3.14 浮点数, 3.14f 单精度浮点型字面值, 类型是float, 3.14L 扩展精度浮点型字面值, 类型是long double;
(d)10 十进制, 10u 无符号整型, 10. 浮点型, 10e-2 浮点型字面值;
练习2.6
1 | int month = 9, day = 7; //定义的month和day均为10进制 |
练习2.7
1 | (a)"who goes with F\145rgus?\012" |
在泛化的转义序列中\141为a,\101为A
练习2.8
1 |
|
练习2.9
1 | (a) std::cin >> int input_value // 错误,不能在输入输出语句中定义变量。 |
练习2.10
报错,未知的初始值
练习2.11
1 | (a) extern int ix = 1024; // 定义 (任何包含了显式初始化的声明即成为定义) |
练习2.12
变量名只能包含字母、数字、下划线,且不能和关键词等重复,不能以数字开头
1 | (a) int doube = 3.14; //非法,double为关键字,不能作为变量名 |
练习2.13
j = 100
1 |
|
练习2.14
合法,输出100 45
1 |
|
练习2.15
1 | (a) int ival = 1.01; //用float初始化int,不合法,会有警告 |
练习2.16
1 | int i = 0, &rl = i; |
练习2.17
10 10
1 |
|
练习2.19
(1)引用在定义时必须初始化,而指针可不初始化;
(2)引用在其生命周期内,只能指向一个对象,而指针可以先后指向不同的对象
(3)指针本身就是一个对象,允许对指针进行赋值和拷贝
练习2.20
让i值变为i平方
1 |
|
练习2.21
1 | (a) double* dp = &i; //非法,不能用int型的变量初始化doube指针 |
练习2.22
1 | if (p) //如果地址不为0 |
练习2.23
不行,如果你把指针理解为一个信封上的地址,那么没有任何手段能保证你填写的地址必然有人住。(别人的回答)
类比于有这个东西和是不是我要的东西;
练习2.24
1 | int i = 42; |
练习2.25
1 | (a) int* ip, i, &r = i; // ip 为int指针类型,i为int型,r为引用类型,初始化为i。 |
练习2.26
1 | (a) const int buf; // 不合法,声明一个const常量的同时必须初始化 |
练习2.27
1 | (a) int i = -1, &r = 0; // 不合法, r为引用,初始化只能指向一个对象。 |
练习2.28
1 | (a) int i, *const cp; // 不合法,定义const类型指针要初始化,cp |
练习2.29
1 | (a) i = ic; // 合法 |
练习2.30
靠右的const是顶层const,靠左的是底层const(针对指针的判断)
1 | (a) const int v2 = 0; int v1 = v2; // v2是顶层const |
顶层const可以进行赋值操作,但底层const有限制,拷入拷出的对象也必须具有相同的底层const,或者两个数据类型可以转换,一般来说非常量可以转换成常量,反之不行;
练习2.31
1 | (a) r1 = v2; // 合法,引用改变值 |
练习2.32
1 | int null = 0, *p = null; |
练习2.33
1 | (a) a = 42; b = 42; c = 42; // a, b, c的值均为42 |
练习2.34
1 |
|
练习2.35
1 | const int i = 42; // i为const int类型 |
练习2.36
decltype((variable))(注意是双层括号)的结果永远是引用
1 | int a = 3, b = 4; // |
练习2.37
1 | int a = 3, b = 4; // a, b均为int |
练习2.38
相同点:都通过已知变量或表达式的类型来指定类型,如:
1 | int i = 2; auto j = i; decltype(i) j = i; //两者相同 |
不同点:auto会忽略顶层const,但decltype不会;auto定义变量必须有初始值,但decltyple不一定;
如果使用引用类型,auto会识别为其所指对象的类型,decltype则会识别为引用的类型;
decltype(())双括号的差别,直接识别为引用类型;
1 | int i = 0, &r = i; |
练习2.40
1 |
|
练习2.41,2.42
{ % hideInline 发挥自己的想象力吧, 参考答案 % }