C++ Primer 中文第 5 版练习答案 第 2 章 变量和基本类型(1~32)
自己写的解答,如有错误之处,烦请在评论区指正!
-
不同类型数据所占的比特数不同,所能表示的数据范围也不同;
无符号类型只能表示大于等于零的数,带符号类型可以表示正数、零和负数;
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
对象。 -
a.
int &r = 0;
不合法,不能用字面值初始化引用;
b. 只要i2
是int
类型或者const int
类型就合法;
c. 合法,r
是一个常量引用;
d. 只要i2
是int
类型或者const int
类型就合法;
e. 只要i2
是int
类型或者const int
类型就合法;
f. 不合法,如果本意是常量引用的话,首先应该去掉第二个const
,其次常量引用必须初始化;
g. 只要i
是int
类型或者const int
类型就合法; -
a.
int *const cp;
不合法,const
类型必须初始化;
b.int *const p2;
不合法,const
类型必须初始化;
c.const int ic
不合法,const
类型必须初始化;
d. 第 2 个const
不合法,const
类型必须初始化;
e. 合法,p
是指向常量的指针,本身不是常量,所以不初始化也可以。 -
a. 合法;
b. 不合法。p1
是一个普通指针,而p3
的第一个const
表明这是个指向常量的指针;(要是合法的话就有可能通过p1
修改一个常量的值,显然这是不允许的)
c. 不合法。p1
是一个普通指针,ic
是const
对象;
d. 合法。不能再把p3
指向别的对象,同时也不能通过p3
修改ic
的值;
e. 不合法。p2
本身是const
对象,初始化之后不能修改其值;
f. 不合法。ic
是const
对象,初始化之后不能修改其值。
对象名 | 顶层 / 底层const |
---|---|
v2 |
顶层 |
p2 |
底层 |
p3 |
同时是顶层和底层 |
r2 |
底层 |
语句 | 说明 |
---|---|
r1 = v2; |
不合法。普通的int& 不能绑定到const int 上。 |
p1 = p2; |
不合法。p2 具有底层const ,而p1 没有。 |
p2 = p1; |
合法。int* 可以转换成const int* ,但是不能通过p2 修改其指向的值。 |
p1 = p3; |
不合法。p3 具有底层const ,而p1 没有。 |
p2 = p3; |
合法。都具有底层const 。 |
- 非法。改为
int null = 0, *p = &null;