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

4.1

105

4.2

(a)(vec.begin())
(b)
(vec.begin() + 1)

4.3

可以,可以根据编程人员的需求自行添加括号改善

4.4

91

4.5

(a)-86
(b)-18
(c)0
(d)-2

4.7

当计算的结果超出该类型所能表示的范围时就会导致溢出

4.8

相等运算符先求值,再进行逻辑与操作,再进行逻辑或操作,按照从左到右的顺序求值。

4.9

cp指向的地址不为0,cp指向对象的值不为0

4.10

#include <iostream>


using namespace std;

int main()
{
	int now;
	while ((cin >> now) && (now != 42))
	{

	}
}

4.11

(a > b) && (b > c) && (c > d)

4.12

先取i值,再计算j < k是否成立,成立为大于0的数,否则为0。再计算i != (j < k) 。

算数>关系>逻辑

4.13

赋值运算符满足右结合律
(a)d = 3.0 , i = 3
(b)d = 3.5 , i = 3

4.14

(a)报错,赋值运算符左侧对象必须是一个可修改的左值
(b)将42赋给i,if条件始终为真

4.15

不能把指针的值赋给int

dval = ival = *pi = 0;

4.16

(a)会先执行!=再执行赋值

if((p = getPtr()) != 0)

(b)同4.14

if(i == 1024)

4.17

前置运算符:先修改运算对象,再将改变后的对象作为求值结果。
后置运算符:将原始对象的值存储下来返回这个未修改的内容,再改变对象的值。
比起前置运算符,后置运算符会导致一种浪费

4.18

会先向后移动一个元素,再输出移动后的值。输出范围为第二个元素到最后一个元素的下一个元素。由于最后一个元素的下一个元素未知,所以会访问到未知内存。

4.19

(a)ptr指向的地址不为0, 所指向的值不为0, ptr向前移动一个元素
(b)ival的值和ival下一个值均不为0
(c)运算顺序未知,不知道编译器会先算vec[ival++]还是vec[ival],因此结果是未知的。可以改为vec[ival + 1] <= vec[ival]

4.20

*表达式ptr->mem等价于(ptr).mem
后置运算符优先级高于解引用运算符, 前置运算符优先级低于解引用运算符
(a)合法,先对iter+1,再返回iter初始值的副本,再对该副本进行解引用
(b)不合法,string类型不能++操作
(c)不合法,iter是一个指针,没有empty()成员
(d)合法
(e)不合法,string类型不能++操作
(f)合法,++和->的优先级一样,所以遵循自左向右结合,先算iter++的值,返回iter初始值的副本,再进行empty()判断。

4.22

注意:条件运算符的优先级非常低, 因此当一条长表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。
条件运算嵌套层数增加会导致代码的可读性急剧下降。

4.23

string p1 = (s + s[s.size() - 1] == 's' ? "" : "s");

4.25

‘q’ << 6运算会把结果隐式转化为int类型,因为6是int类型,再按位取反即可
1111 1111 1111 1111 1110 0011 1000 0000

4.26

在某些系统上,int占16为,因此如果用unsigned int来存储的话,在这些机器上就会发生位数不够用的情况。而unsigned long则可以保证在任何机器上都至少有32位。

4.27

(a)3
(b)7
(c)1
(d)1

4.29

10, sizeof(x) = 10*4, sizeof(*x) = 4
1, sizeof (p ) = 4(整型指针),sizeof(*p) = 4

4.32

遍历数组ia,其中ptr用指针遍历,ix用下标遍历

4.33

逗号的优先级最低
因为逗号表达式的优先级最低,则该语句为

someValue ?++x, ++y : --x), --y;

如果条件为真, 执行++x, ++y, --y
如果条件为假, 执行–x, --y

4.35

(a)‘a’先转化为int进行计算,得到的结果再转化为char
(b)int转double,ui转double, 结果转float
(c)unsigned int先提升为float,float再转为double
(d)ival先转为float,float再转为double,最后double转为char

4.36

i *= static_cast<int> (d);

4.37

(a)pv = static_cast<void*>((const_cast<string>(ps))
(b)i = static_cast(pc)
(c)pv = static_cast<void
>(&d)
(d)pc = static_cast<char
>(pv)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值