https://github.com/jzplp/Cpp-Primer-Answer
-
練習2.1
位數不同,能表示的整數範圍大小不同。
無符號類型只能表示大於等於0的數。有符號則也可以表示小於0的數。
float和double位數不同,能表示的浮點數精度和範圍不同。 -
練習2.2
利率: 浮點數,比如float
本金: 整數,比如int
付款: 浮點數,比如double
因爲利率一般都不是整數,本金是整數,最後的付款可能也不是整數。 -
練習2.3
輸出結果爲:
32
MAX-32
32
-32
0
0
其中 MAX是int類型的最大值+1。 -
練習2.4
2.4程序代碼
結果證明2.3的估計正確。 -
練習2.5
(a)
'a' char
L'a' wchar_t
"a" char數組
L"a" wchar_t數組
(b)
10 int
10u unsigned int
10L long
10uL unsigned long
012 八進制int
0xC 16進制int
(c)
3.14 double
3.14f float
3.14L long double
(d)
10 int
10u unsigned int
10. double
10e-2 double
-
練習2.6
有區別。
9並不是8進制中的數字,所以09會發生編譯錯誤。 -
練習2.7
(a)
含義: "What goes with Fergus? \n"
類型:char數組
(b)
含義: 31.4
類型:long double
(c)
含義: 1024.0
類型:float
(d)
含義: 3.14
類型:long double -
練習2.8
2.8程序代碼 -
練習2.9
(a) 不能對定義語句進行運算操作。
改正:
int input_value;
std::cin >> input_value;
(b) 錯誤,花括號的初始化形式不支持丟失信息的初始化。
改正:
int i = (3.14);
(c) 如果wage之前已經定義,則正確,如果未定義則錯誤。
改正:
double wage = 9999.99 , salary = wage;
(d) 正確,但是會損失小數部分。
-
練習2.10
global_str 初值 空字符串
global_int 初值 0
local_int 初值 未定義
local_str 初值 空字符串 -
練習2.11
(a) 定義 (b) 定義 (c) 聲明 -
練習2.12
(a) 非法 (b) 合法 (c) 非法 (d) 非法 (e) 合法 -
練習2.13
j的值位100 -
練習2.14
合法
輸出: 100 45 -
練習2.15
(a) 合法
(b) 不合法 引用不能綁定在字面值上
(c) 如果ival爲浮點數則不合法
(d) 不合法 引用定義的時候沒有初始化 -
練習2.16
(a) 合法 給d賦值
(b) 合法 i給d賦值,並隱式轉換了類型
(c) 合法 d給i賦值,並隱式轉換了類型
(d) 合法 d給i賦值,並隱式轉換了類型 -
練習2.17
輸出:
10 10 -
練習2.18
2.18程序代碼 -
練習2.19
- 指針本身是對象,有內存空間,引用沒有
- 指針可以改變指向的對象,引用不可以
- 指針定義是可以不指定指向的對象,引用不可以
- 指針有空指針,或者不指向對象,引用不可以
等等
-
練習2.20
計算i的值的平方,最後i的值爲1764 -
練習2.21
(a) 非法 指針類型錯誤
(b) 非法 指針不能直接賦值爲int
(c) 合法 -
練習2.22
- 如果p指向了一個對象
- 如果p指向的對象值不爲0
-
練習2.23
不能。因爲即使指向“非法對象”,有時候也能正常得到結果。所以無法判斷。 -
練習2.24
因爲void指針能指向任何類型的對象。但是long指針和int指針是不同的,不能混用。 -
練習2.25
(a)
ip: 指向int的指針變量,值未定義
i: int類型變量,值未定義
r: int類型的引用,值爲i的值
(b)
i: int類型變量,值未定義
ip: 指向int的指針變量,值爲0
(c)
ip: 指向int的指針變量,值未定義
ip2: int類型變量,值未定義 -
練習2.26
(a) 不合法。const常量必須初始化
(b) 合法
(c) 合法
(d) ++cnt; 合法
++sz; 不合法 因爲sz是常量 -
練習2.27
(a) r不合法
(b) 合法(如果i2是一個int變量)
(c) 合法
(d) 合法
(e) 合法
(f) 不合法
(g) 合法 -
練習2.28
(a) cp不合法 常量指針必須初始化
(b) p2不合法 常量指針必須初始化
(c) 合法
(d) 不合法 常量指針必須初始化
(e) 合法 -
練習2.29
(a) 合法
(b) 不合法 指向常量的指針不能賦值給指向變量的指針
(c) 不合法 指向常量的地址不能賦值給指向變量的指針
(d) 不合法 常量指針的值不能改變
(e) 不合法 常量指針的值不能改變
(f) 不合法 常量的值不能改變 -
練習2.30
v2 頂層const
p2 底層const
p3 頂層+底層const
r2 底層const
注:答案書上未把p3標爲底層const,答案書錯誤。 -
練習2.31
r1 = v2 合法
p1 = p2 不合法
p2 = p1 合法
p1 = p3 不合法
p2 = p3 合法 -
練習2.32
非法 改爲
int null = 0 , *p = &null;
- 練習2.33
a = 42; a的值變爲42
b = 42; b的值變爲42
c = 42; c的值變爲42
d = 42; 編譯器Error 不能給指針賦值int常量(除0之外)
e = 42; 編譯器Error 不能給指針賦值int常量(除0之外)
g = 42; 編譯器Error 不能給int常量的引用賦值
-
練習2.34
2.34程序代碼
註釋的部分是編譯器Error的語句。
推論正確。 -
練習2.35
2.35程序代碼
i int常量
j int變量
k int常量的引用
p int常量的指針(auto後面的*可以不加)
j2 int常量
k2 int常量的引用 -
練習2.36
a int變量 4
b int變量 4
c int變量 4
d int引用 4 -
練習2.37
a int變量 3
b int變量 4
c int變量 3
d int引用 3 -
練習2.38
auto是根據初始化的類型來判斷,decltype是根據一個額外的表達式來判斷類型。
類型一樣的情況:
int i = 0;
auto a = i;
decltype(i) b;
類型不一樣的情況:
int i = 0,&j = i;
auto a = j;
decltype(j) b = i;
-
練習2.39
2.39錯誤程序代碼
會發生編譯錯誤。錯誤信息:
[Error] expected ';' after struct definition -
練習2.40
2.40程序代碼 -
練習2.42
Sales_data.h程序代碼
重寫1.20程序代碼
重寫1.21程序代碼
重寫1.22程序代碼
重寫1.23程序代碼
重寫1.25程序代碼