C++ primer 第五版 练习题记录

继续记录我的C++ 学习之路,本文是第四章的练习题,第三章的链接在这里:

https://mp.csdn.net/mp_blog/creation/editor/124473013https://mp.csdn.net/mp_blog/creation/editor/124473013 4.1.2节练习

练习4.1

105

练习4.2

(a) *(vec.begin())

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

4.1.3节练习

练习4.3

可以接受,允许编译器采用任何求值顺序,使编译器在优化中可以根据需要调整实现表达式求值的指令序列,以得到效率更高的代码。

4.2节练习

练习4.4

91

练习4.5

(a)  -86

(b)  -18

(c)  0

(d)  -2

练习4.6

int main()
{
	int i = 4;
	i % 2 == 0 ? cout << "even": cout << "odd";

}

练习4.7

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

int main()
{
	short i = 32767;
	short j = i + 1;
	short a = i + 2;
	short b = i * 2;

}

4.3节练习

练习4.8

相等性运算符 > 逻辑与 > 逻辑或

练习4.9

cp为一个地址,不为0,所以继续执行逻辑与右侧部分,*cp为一个字符串,不为0,返回值为true。

练习4.10

int main()
{
	int a = 0;
	while(cin >> a && a != 42)
	{ }

}

练习4.11

int main()
{
	int a = 4, b = 2, c = 2, d = 1;
	a > b && b > c && c > d ? cout << "true" : cout << "false";

}

练习4.12

执行顺序为: i != (j < k) ; 先比较 j 和 k 的大小关系,j < k则为真,将结果转化为 1 ,然后判断 i 是否不等于 1.

4.4节练习

练习4.13

(a)  d  = 3 ; i = 3

(b)  d = 3.5 ; i = 3

练习4.14

if (42 = i)// 报错,表达式必须是可修改的左值

if (i = 42)// 42不为零,条件为真,执行 if 语句

练习4.15

不能将指针的值赋给int

dval = ival = *pi = 0;

练习4.16

(a)赋值运算符优先级较低,应该给需要赋值部分加上括号使其符合我们的原意。

(b)条件判断永远为真,若是想判断 i 和1024是否相等,应该用 “==”。

4.5节练习

练习4.17

前置递增/递减运算符首先将运算对象 ±1 ,然后将改变后的对象作为求值结果;后置版本也会将运算对象 ±1 ,但是求值结果是运算对象改变之前那个值的副本。

前置版本只储存改变后的值,后置版本既保存改变后的值也保存改变前的值。

练习4.18

无法输出第一个元素,而且若序列中没有负值,程序将可能试图引用一个根本不存在的元素。

练习4.19

(a)*ptr != 0 && *ptr++  // *ptr指向的指针不为0;

(b)判断 ival 和 ival + 1 的值是否都为零;

(c)该赋值语句是未定义的;vec[ival] <= vec[ival+1]

 4.6节练习

(a)合法,首先对iter加1,再输出iter指向的值;

(b)不合法,iter指向的是字符串,字符串没有加法运算;

(c)不合法,iter是一个指针,它没有名为empty的成员;

(d)合法,检查iter指向的对象是否为空;

(e)不合法,*iter得到iter指向的字符串,字符串没有加法运算;

(f)合法,检查iter指向的对象是否为空,然后iter加1。

4.7节练习

练习4.21

int main()
{
	vector<int> vec{1,2,3,4,5,6,7,8,9};
	for (auto& a : vec)
	{
		a % 2 == 1 ? a *= 2 : a = a;
		cout << a << endl;
	}

}

练习4.22

纯条件运算符

int main()
{
	int grade;
	cin >> grade;
	(grade > 90) ? cout << "high pass" : (grade > 60 && grade < 75) ? cout << "low pass" : (grade < 60) ? cout << "fail" : cout << "pass";

}

+ if

int main()
{
	int grade;
	cin >> grade;
	if (grade > 60)
	{
		grade > 90 ? cout << "high pass" : grade < 75 ? cout << "low pass" : cout << "pass";
	}
	else
		cout << "fail";

}

练习4.23

?: 条件运算符优先级过低,导致该表达式的运算顺序为 字符串 s,加上s[3] 后的字符串与字符类型的 's' 进行比较,导致出错。改为:

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

练习4.24

加入条件运算符满足的是左结合律,则表达式可写为:
finalgrade = ((grade > 90) ? "high pass" : (grade < 60))?"fail":"pass";

首先判断grade的值是否大于90,成立则为 high pass ,不然表达式为 grade < 60,编译无法通过,即使通过,也无法得到high pass、pass 和 fail 三种情况。

4.8节练习

练习4.25

注意运算顺序,先取反再移位

最后的结果为:1111 1111 1111 1111 1110 0011 1000 0000   值为:-7296

练习4.26

unsigned int 只能确保占用16位,而班级中有30个学生,可能会发生溢出。

练习4.27

3的二进制表示:0000 0011

7的二进制表示:0000 0111

(a)3

(b)7

(c)true

(d)true

练习4.28

	cout << sizeof (char);

练习4.29

第一个cout表示:数组的大小/单个数组元素的大小,得到数组中元素的个数,10。

第二个cout表示:指针p所占空间的大小/单个数组元素的大小,1。

练习4.30

(a)(sizeof x)+ y;

(b)sizeof (p -> mem[i]);

(c)(sizeof a)< b;

(d)sizeof (f())

练习4.31

前置版本只储存改变后的值,后置版本既保存改变后的值也保存改变前的值,造成浪费。

重写程序如下:

	for (vector<int>::size_type ix = 0; ix != ivec.size(); ix++, cnt--)

练习4.32

当ix没有达到size并且指针ptr没有指向数组最后一个元素的下一个位置时,执行循环体。

练习4.33

(?:)的优先级高于 (,),所以表达式含义为:

如果someValue的值为真,则执行 ++x,++y 和 --y,反之执行 --x 和 --y。

4.11.1节练习

练习4.34

(a)fval 转换成 bool;

(b)ival 转换成 float,与 fval 的和转换成double;

(c)cval 先转换成 int,与 int 相乘得到的值转换成 double.

练习4.35

(a)有,‘a’先转换成 int,与 3 求和后的值再转换成 char;

(b)有,ival 先转换成 double,然后 ui 转换成 double ,然后得到二者的差值,差值转换为 float;

(c)有,ui 转换成 float,然后二者的乘积转换成 double;

(d)有,ival 转换成 float,与 fval 相加的和转换成 double,与 dval 相加后转为 char.

 4.11.3 节练习

练习4.36

	i *= static_cast<int>(d);

练习4.37

(a)pv = static_cast<void*>(const_cast<string*>(ps));

(b)i = static_cast<int>(*pc);

(c)pv = static_cast<void*>(&d);

(c)pc = static_cast<char*>(pv).

练习4.38

将 j/i 的值强制转换成double类型后赋给slope。

第四章完结,撒花。学习第四章的时候还是开了太多小差了,按照后面的日程安排,感觉立的本周看完四五章的flag要倒了.........救命,加把劲干完啊啊啊啊啊啊啊。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值