C++ Primer 中文版(第 5 版)练习解答合集
自己写的解答,如有错误之处,烦请在评论区指正!
-
不同类型数据所占的比特数不同,所能表示的数据范围也不同;
无符号类型只能表示大于等于零的数,带符号类型可以表示正数、零和负数;
float
的精度不如double
。 -
全部用
double
,因为全部涉及浮点数,但是贷款业务并不需要long double
的精度,不选float
的原因参考书 P32 建议:如何选择类型
的最后一条。
#include <iostream>
int main() {
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; // 正常输出 32
std::cout << u - u2 << std::endl; // 溢出,输出 4294967264
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; // 正常输出 32
std::cout << i - i2 << std::endl; // 正常输出 -32
std::cout << i - u << std::endl; // u 被类型转换为int类型,输出 0
std::cout << u - i << std::endl; // u 被类型转换为int类型,输出 0
return 0;
}
-
略
-
a.
char
,wchar_t
,char
类型字符串,wchar_t
类型字符串;
b.int
,unsigned
,long
,unsigned long
,int
,int
;
c.double
,float
,long double
;
d.int
,unsigned
,double
,double
。 -
第一组是十进制,第二组是八进制,且第二组的
09
会产生编译错误(9
不能出现在八进制表示中)。 -
a. 等价于
"Who goes with Fergus?\n"
,char
类型字符串;
b.long double
;
c.float
;
d.long double
。
#include <iostream>
int main() {
std::cout << "\62\115\12";
// 修改后:
// std::cout << "\62\t\115\12";
return 0;
}
-
a. 非法,应先定义变量再输入;
b.i
被列表初始化为3
(本地编译会有 warning);
c. 若wage
在前文中未被定义则非法,反之由于赋值运算符从右往左进行,salary
和wage
的值最后都是9999.99
;
d.i
被初始化为3
。 -
四个变量的初值分别是:
""
(空字符串),0
,未定义,未定义。 -
a. 定义;
b. 定义;
c. 声明。 -
a,d 是非法的名字。
-
100
-
合法,输出
100 45
。 -
b. 引用类型的初始值必须是一个对象;
d. 引用必须被初始化。 -
全部合法。
-
10 10
-
略
-
最大的区别:指针有自己的一块内存空间,存放其指向对象的地址,而引用只是别名,没有空间。
-
定义
i
,并将其初始化为42
;
定义指针p1
指向i
;
修改i
的值为42 * 42
。 -
a. 非法,类型不匹配;
b. 非法,类型不匹配; -
if (p)
等价于if (p != nullptr)
;
if (*p)
等价于if (*p != 0)
。 -
不能,只能知道指针类型以及其指向的内存地址,至于是否合法需要上下文。
-
void*
可用于存放任意对象的地址,所以p
合法;而lp
的类型是long*
,&i
的类型是int*
,类型不匹配,lp
非法。
a.
变量 | 类型 | 值 |
---|---|---|
ip | int* | nullptr |
i | int | 0 |
r | int& | 0 |
b.
变量 | 类型 | 值 |
---|---|---|
i | int | 0 |
ip | int* | nullptr |
c.
变量 | 类型 | 值 |
---|---|---|
ip | int* | nullptr |
ip2 | int | 0 |
- a. 不合法,
const
对象必须初始化;
b. 合法
c. 合法,用于初始化另一个对象的时候无所谓;
d.++cnt
没问题,++sz
不合法,sz
是const
对象。