C++ Primer 第五版第四章习题答案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LL596214569/article/details/82916983

书籍版本:2019年9月第一版;王刚 杨巨峰译;电子工业出版社

编译器 : win10  && VS2015

4.1

5+10*20/2 = 5 + ((10 * 20)/ 2) = 105

4.2

*vec.begin() = *(vec.begin);

*vec.begin() + 1= (*(vec.begin) ) + 1;

4.3

有四种运算符明确定义了求值顺序,包括: &&   ||     ?:   ,

其余的没有明确求值顺序其实我觉得不太好,因为这就将计算结果的决定权交给了编译器的定义者而不是真正的开发者,但是求值顺序太多了,真正想要全部定义或者定义一个万能的也不太可能,所以还是要开发者自身多注意求值的运算符的使用。

4.4

12/3*4+5*15+24%4/2  =  91;



#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{

	cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 << endl;

	system("pause");
    return 0;
}

4.5

a. -30*3+21/5 = -86  或者-85.8

b. -30+3*21/5 = -18

c. 30/3*21%5 = 42

d. -30/3*21%4 = -52

这个题其实我觉得有点表述不明,题目只说写出这些表达式的求值结果,但并没有说清楚返回值类型,返回值类型不同返回值不同,暂且看做int型返回值吧。

4.6

int num;

if(num%2) {cout<<"偶数“<<endl;}

else{cout<<"奇数“<<endl;}

4.7

要表示的数据值超出数据类型的值域范围时,就是溢出。

short a = 32768;

unsigned a = -10;

int a = 123456789*123456789

4.8

逻辑与:左面为真再判断右面

逻辑或:先判断左面为假再判断右面

相等性运算符:右边的转换为左边的类型再与左边比较

4.9

cp不为空并且cp首位不为空

4.10

int num;

while(cin>>num && num != 42)

{};

4.11

a > b && b > c && c > d

4.12

判断k是否大于(i!=j)的返回值

4.13

a. d = 3.00,i=3;

b. d = 3.5,i =3;

4.14

if(42=i)  报错

if(i=42) 将i赋值为42;

4.15

无法将指针赋值给int型变量;

4.16

a. 不等于优先级高于赋值,应改为:if((p = getPtr()) != 0)

b. 这样写并不是判断i与1024是否相等,而是将1024赋值给了i,应改为:if(i == 1024)

4.17

前置递增运算符先进行递增运算,然后返回的是递增之后的值

后置递增运算符先调用当前值,之后对当前值进行递增运算

4.18

使用前置递增运算符会导致向量中的第一个元素没有被输出

4.19

a. ptr不为空并且ptr所指向的对象的值也不为空

b.表达式错误,会先对ival进行自增运算,之后判断自增之后的ival是否为空,正确的写法应先判断ival是否为空之后再++

c.没有意义,恒成立。相当于:vec[ival] <= vec[ival]; ival++;

4.20

直接输出题目给出的值会有问题,最好先给iter赋初值,我将iter赋值为了对应的vector的begin;

a.首先对iter解引用,然后让iter++指向下一个位置

b.不合法,(*iter)对iter解引用后得到的值是string类型,无法进行++操作

c.不合法,解引用云算法优先级低于点运算符,所以相当于*(iter.empty()),但是iter是指针,不能使用点运算符

d.返回值为iter所指向的值是否为空

e.不合法,相当于++(*iter),但是*iter之后的值是string,没有++操作

f. 相当于 iter->enpty();iter++;

4.21


#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	vector<int> arr;
	for (int i = 0; i < 10; i++)
	{
		arr.push_back(i);
	}
	for (int i = 0; i < arr.size(); i++)
	{
		arr[i] = (arr[i] % 2 != 0) ? arr[i]*2 : arr[i];
		cout << arr[i] << endl;
	}

	system("pause");
    return 0;
}

4.22


#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	int num;// 分数
	cin >> num;
	// if语句版
	if (num < 60)
	{
		cout << "fail" << endl;
	}
	else if (num > 60 && num < 75)
	{
		cout << "low pass" << endl;
	}
	else if (num > 90 )
	{
		cout << "high pass" << endl;
	}
	else
	{
		cout << "pass" << endl;
	}

	//条件运算符版
	string strFinalGrade;
	strFinalGrade = (num > 90) ? "high pass"
		: (num > 60 && num < 75) ? "low pass"
		: (num < 60) ? "fail"
		: "pass";
	cout << "条件运算符" << strFinalGrade << endl;
	system("pause");
    return 0;
}

 if语句的好理解,但是代码很冗余。

4.23

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

4.24

满足左结合律时会报错,有未明确的值在右侧;

4.25

q =0000 0000 0000 0000 0000 0000  0111 0001

~q = 1111 1111 1111 1111 1111 1111 1000 1110

(~q) << 6 = 1111 1111 1111 1111 1110 0011 1000 0000 

4.26

unsigned int 是16位,无法保存第27个学生的成绩

4.27

u11 = 3 = 0000 0000 0000 0000 0000 0000 0000 0011

u12 = 7 =  0000 0000 0000 0000 0000 0000 0000 0111

a. u11 & u12 = 0000 0000 0000 0000 0000 0000 0000 0011 = 3

b. u11 | u12 = 0000 0000 0000 0000 0000 0000 0000 0111 = 7

c. u11 && u12 = 1

d. u11 || u12 = 1

4.28


#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	cout << "bool " << sizeof(bool) << endl;
	cout << "char " << sizeof(char) << endl;
	cout << "short " << sizeof(short) << endl;
	cout << "int " << sizeof(int) << endl;
	cout << "long " << sizeof(long) << endl;
	cout << "long long " << sizeof(long long) << endl;
	cout << "float " << sizeof(float) << endl;
	cout << "double " << sizeof(double) << endl;
	cout << "long double " << sizeof(long double) << endl;

	system("pause");
    return 0;
}

4.29

第一个值为10是因为求得是数组中元素的数量;第二个值为1是因为p为一个地址,*p是一个int变量

4.30

a. sizeof ( x + y)

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

c. sizeof (a) < b

d. sizeof( f() )

4.31

用前置版本是因为之前书中就提过后置版本可能会造成资源浪费

改成后置版本代码不需要改

4.32

ptr指向ia的begin,ix记录当前的位置,当ptr指向ia的最后一个,并且ix也等于ix的长度时循环终止

4.33

根据运算符优先级表  优先级: ++  >   ?:   >>   ,

但由于?:是满足右结合律,

所以 = (someValue ? ++x, ++y : --x), --y

当 someValue 为真时,计算 ++x, ++y;在计算 --y;

当 someValue 为假时,计算 --x,在计算 --y;

4.34

a. fval转换为bool类型

b. ival 与 fval的和转换为 dval的类型

c.  cval 提升成 int,和 ival 相加后再提升为 double 和 dval 相加

4.35

a. ‘a’ 先提升为 int 和 3 相加,在转换成 char 赋给 cval

b.ival 先提升为 float,和 1.0 相乘,然后转换成 unsigned int,和 ui 做减法,其结果转换成 float 赋给 fval

c. ui 转换成 float 和 fval 相加,其结果转换为 double 赋给 dval

d.ival 提升成 float 和 fval 相加。其结果再提升为 double 和 dval 相加。再将其结果转换为 char 赋给 cval

4.36

i *= static_cast<int>d;

4.37


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

i = static_cast<int>(*pc);

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

pc = static_cast<char*>(pv);
4.38

将计算 (j / i) 的结果强制转换为 double 类型,然后赋给 slope。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

猜你喜欢

转载自blog.csdn.net/LL596214569/article/details/82916983