Skip to content

Commit 6f5ca58

Browse files
authored
Merge pull request applenob#58 from AXDHY/master
Update ch02.md & ch04.md
2 parents 5fdd163 + 3afa468 commit 6f5ca58

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

excersize/ch02.md

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
解:
77

8-
C++ 规定 short 和 int 至少16位,long 至少32位,long long 至少64位。 带符号类型能够表示正数、负数和 0 ,而无符号类型只能够表示 0 和正整数。
8+
C++ 规定 short 和 int 至少16位,long 至少32位,long long 至少64位。 带符号类型能够表示正数、负数和 0 ,而无符号类型只能够表示 0 和正整数。浮点数的取值范围和精度不同,计算效率也有差异。
99

1010
## 练习2.2
1111
计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
@@ -243,7 +243,7 @@ std::cout << i << " " << ri << std::endl;
243243

244244
解:
245245

246-
输出:10, 10
246+
输出:10 10
247247

248248
## 练习2.18
249249
编写代码分别改变指针的值以及指针所指对象的值。
@@ -313,7 +313,7 @@ if (*p) // ...
313313

314314
解:
315315

316-
不能,因为首先要确定这个指针是不是合法的,才能判断它所指向的对象是不是合法的
316+
能,可以使用try catch的异常处理来分辨指针p是否指向一个合法的对象,但通过普通控制结构无法实现
317317

318318
## 练习2.24
319319
在下面这段代码中为什么 p 合法而 lp 非法?
@@ -363,7 +363,7 @@ int *const p2 = &i2; // 合法,常量指针
363363
const int i = -1, &r = 0; // 合法
364364
const int *const p3 = &i2; // 合法
365365
const int *p1 = &i2; // 合法
366-
const int &const r2; // 不合法, r2 是引用,引用没有顶层 const
366+
const int &const r2; // 不合法, r2 是引用, 引用自带顶层 const, 第二个const写法多余但合法, 但引用需要初始化.
367367
const int i2 = i, &r = i; // 合法
368368
```
369369

@@ -387,9 +387,9 @@ const int *p; // 合法. 一个指针,指向 const int
387387
i = ic; // 合法, 常量赋值给普通变量
388388
p1 = p3; // 不合法, p3 是const指针不能赋值给普通指针
389389
p1 = &ic; // 不合法, 普通指针不能指向常量
390-
p3 = &ic; // 合法, p3 是常量指针且指向常量
391-
p2 = p1; // 合法, 可以将普通指针赋值给常量指针
392-
ic = *p3; // 合法, 对 p3 取值后是一个 int 然后赋值给 ic
390+
p3 = &ic; // 不合法, p3 是常量指针且指向常量, 故p3 不能被修改, 本句赋值语句正在修改
391+
p2 = p1; // 不合法, p2是常量指针, 有顶层const, 不能被修改
392+
ic = *p3; // 不合法, 对 p3 取值后是一个 int 然后赋值给 ic, 但ic是常量不能被修改
393393
```
394394

395395
## 练习2.30
@@ -425,7 +425,11 @@ int null = 0, *p = null;
425425
```
426426
解:
427427

428-
合法。指针可以初始化为 0 表示为空指针。
428+
非法,即使int的值恰好是0,也不能直接给指针赋值int变量。应改为
429+
```cpp
430+
int null = 0, *p = &null;
431+
```
432+
而且应该注意到,null都是小写,并不是关键字或者预处理变量。
429433

430434
## 练习2.33
431435
利用本节定义的变量,判断下列语句的运行结果。

excersize/ch04.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ if (i == 1024)
212212

213213
## 练习4.20
214214

215-
假设`iter`的类型是`vector::iterator`, 说明下面的表达式是否合法。如果合法,表达式的含义是什么?如果不合法,错在何处?
215+
假设`iter`的类型是`vector<string>::iterator`, 说明下面的表达式是否合法。如果合法,表达式的含义是什么?如果不合法,错在何处?
216216

217217
```cpp
218218
(a) *iter++;
@@ -419,7 +419,8 @@ cout << sizeof(p)/sizeof(*p) << endl;
419419

420420
解:
421421

422-
第一个输出结果是 10。第二个结果1,此处用法不合理不是未定义,参考https://www.geeksforgeeks.org/using-sizof-operator-with-array-paratmeters/。
422+
第一个输出结果是 10。
423+
第二个结果取决于机器。sizeof(p)即int\*的内存空间大小, 32位机4B, 64位机8B; sizeof(\*p)即sizeof(int), 通常为4B, C++标准规定其不得小于2B。
423424

424425
## 练习4.30
425426

0 commit comments

Comments
 (0)