[C++ primer]第二章习题答案

[C++ primer] 第二章习题答案

  • 2.1
  • 2.2
  • 2.3
  • 2.6
  • 2.9
  • 2.10
  • 2.11
  • 2.12
  • 2.13
  • 2.14
  • 2.15
  • 2.16
  • 2.17
  • 2.19
  • 2.20
  • 2.21
  • 2.22
  • 2.23
  • 2.24
  • 2.25
  • 2.26
  • 2.27
  • 2.28
  • 2.29
  • 2.30
  • 2.31
  • 2.32
  • 2.33
  • 2.35
  • 2.36
  • 2.37
  • 2.38

2.1

int跟short长度都至少为16位,long至少为32位,long long至少为64位。
无符号类型可以表示正数和0,将其转为二进制码时所有位数均为数字位。
有符号类型可以表示正数、负数和0,将其转为二进制码时最高位要存符号位,1为正数,0为负数。
float为单精度浮点数,精度7位。double为双精度浮点数,精度16位。执行浮点数运算一般选用double,因为double精度更高,且计算代价与float相差无几。

2.2

double

2.3

当从无符号数中减去一个值时,必须保证结果不为负数,如果为负数,机器会取模

2.6

int month = 09, day = 07;

为八进制整数。

2.9

(a)不能在输入的时候才定义。
(b)列表初始化,i被隐式的强制转换为3
(c)wage未定义
(d)i被隐式的强制转换为3

2.10

global_int = 0;
global_str = “”;
local_int未确定
local_str在类std中,由std决定为空字符串

默认初始化
(1)定义于任何函数体之外的变量被初始化为0
(2)定义在函数体内部的内置类型变量将不被初始化,其值为未确定。
(3)每个类自己决定其初始化对象的方式

2.11

定义 定义 声明

2.12

标识符由字母、数字、下划线组成,必须由字母或下划线开头,对大小写敏感。

(a)错误,不能用double作变量名
(b)正确
(c)错误,有无效字符
(d)错误,不能由字母开头
(e)正确

2.13

j = 100

2.14

合法,但最好程序中不要出现同名变量
输出 100 45

2.15

(b)错误,引用类型的初始值必须是一个对象。
(d)错误,引用类型必须初始化。

2.16

(a)合法,d = 3.14159
(b)合法, r2 = 0;
(c)合法,i = 0;
(d)合法, r1 = 0;

2.17

10 10

2.19

指针本身是一个对象,允许对指针进行赋值和拷贝。且指针无需在定义时赋值。
引用并非是一个对象,只是为一个已经存在的对象起另外一个名字。在定义时必须初始化。

2.20

这段代码定义了一个整型i = 42,定义一个指针p指向i所在的地址,第三行将i赋值为42 * 42;

2.21

(a)不合法,引用的类型要跟被引用类型一致。
(b)不合法,类型不匹配
(c)合法

2.22

(a)判断p是否时空指针
(b)判断p所指对象是否为0

2.23

不能,无法确定指针是否合法()

2.24

lp类型不匹配
void定义了一个空指针,可以指向任意对象的地址。

2.25

(a)ip为int类型指针,i为int型变量, r为int型引用
(b)i为int型变量,ip为空指针
(c)ip为int型指针,ip2为int型变量

2.26

(a)不合法,const必须初始化为常量
(d)不合法,sz是一个const类型,不能被改变

2.27

(a)不合法,r必须引用一个对象
(b)合法,p2为常量指针,指向i2所在的地址
(c)合法,此时r为一个常量的引用。(注意const int &i 与int &i的区别)
(d)合法,p3是一个指向常量的常量指针,指向i2的地址
(e)合法,p1是一个指向常量的指针
(f)不合法,必须初始化
(g)合法

2.28

(a)~(d)不合法,都存在没有初始化的问题
(e)合法

2.29

(a)合法
(b)不合法,类型不一致
(c)不合法,类型不一致
(d)不合法,常量指针const不能被二次赋值
(e)不合法,常量指针
const不能被二次赋值
(f)不合法,常量const 不能被二次赋值

2.30

v2顶层const, p2底层const, p3即是顶层const又是底层const, r2底层const

2.31

顶层const的拷贝不受限制,但是底层const的拷贝的对象必须具有相同的底层const资格。一般来说:非常量可以赋值给常量,反之则不行

合法
不合法,p2是底层const, p1是非常量
合法
不合法,p3既是顶层又是底层。
合法

2.32

类型不符合
改为:

int null = 0, *p = &null;//p指向null所在的地址

2.33

a = 42;
b = 42;
c = 42;
非法,d是整型指针,不能给他赋值常数
非法,e是指向常量的指针
非法,g是常量的引用

2.35

j:int(auto会忽略顶层const, 保留底层const)
k:const int &
p:const int *
j2:const int
k2:const int &

2.36

a = 4
b = 4
c:int c = 4
d:int & d = 4

2.37

a = 3
b = 4
c:int c = 3
d:int & d = 4

2.38

auto 和 decltype的区别主要有三个方面:

第一,auto类型说明符用编译器计算变量的初始值来推断其类型,而decltype虽然也让编译器分析表达式并得到它的类型,但是不实际计算表达式的值。

第二,编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。例如,auto一般会忽略掉顶层const,而把底层const留下来。与之相反,decltype会保留变量的顶层const。

第三,与auto不同,decltype的结果类型与表达式形式密切相关,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或多层括号,则编译器将推断得到引用类型。

你可能感兴趣的:(C++,C++,C++,primer)