C++ Primer(5e)第4章习题

4.1

105

4.2

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

4.3

可以接受,程序的正确性和效率都需要程序员的参与才完美。

4.4

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

/* 测试 */
#include
using namespace std;

int main()
{
	int a = 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;
	cout << a << endl;
	return 0;
}

4.5

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

4.6

string s = (n % 2 == 0)?  "偶数" : "奇数"; 

4.7

溢出:当计算的结果超出该类型所能表示的范围。

4.8

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

4.9

const char *cp = "Hello World";
if (cp && *cp)
先是解引用cp然后进行逻辑与,如果cp的值为ture,则不需要进行后面的判断。

4.10

#include
using namespace std;

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

4.11

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

4.12

i != j < k
首先判断j 是否小于k,是返回1,不是则返回0;然后判断i是否不等于返回的值。

4.13

(a)i = 3, d = 3.0
(b)d = 3.5, i = 3

4.14

if (42 = i)  // 错误
if (i = 42)  // if判断为真,执行if内语句

4.15

duoble dval; int ival; int *pi;
dval = ival = pi = 0;
不能把指针的值赋给Int
修改:dval = ival = 0;  pi = 0;

4.16

(a) if ((p = getPtr()) != 0)
(b) if (i == 1024)

4.17

前置递增运算符:首先将运算对象加1(或减1),然后将改变后的对象作为求值结果。
后置递增运算符:首先将运算对象加1(或减1),然后将改变前的对象作为求值结果。

4.18

如果使用前置运算符,不但无法输出第一个元素,而且更糟糕的是如果序列中没有负值,
程序将可能试图解引用一个根本不存在的元素。

4.19

(a)ptr != 0 && *ptr++   // ptr地址不为0且ptr指向的元素的值不为0
(b)ival++ && ival  // ival的值不为0
(c)vec[ival++] <= vec[ival]    // vec第ival - 1 个元素 小于等于它自己本身

4.20

(a)迭代器iter加1,然后把原来迭代器iter指的值解引用
(b)解引用迭代器指的值iter,然后把迭代器iter加1
(c)错误,iter是迭代器,它没有名为empty的成员
(d)运行iter指代的对象的empty成员
(e)解引用迭代器iter所指对象,然后iter所指对象的值加1
(f)运行迭代器所指对象,然后迭代器加1

4.21

#include
#include
using namespace std;

int main()
{
	vector<int> v = { 1, 2, 3, 4, 5, 6 };
	for (auto it = v.begin(); it != v.end(); ++it)
	{
		cout << ((*it % 2 == 0) ? *it : (*it * 2));
		cout << " ";
	}
	cout << endl;
	return 0;
}

4.22

/* 只使用条件运算符 */
#include
using namespace std;

int main()
{
	int grade = 0;
	cout << "Enter a grade(0~100):" << endl;
	cin >> grade;
	string finalgrade;
	cout << ((grade > 90) ? "high pass" : (grade > 75) ? "low pass" :
		(grade > 60) ? "pass" : "fail");
	cout << endl;
	return 0;
}
/* 使用if语句 */
#include
using namespace std;

int main()
{
	unsigned grade = 0;
	cout << "Enter a grade(0~100):" << endl;
	cin >> grade;
	if (grade > 90)
		cout << "high pass";
	else if (grade > 75)
		cout << "low pass";
	else if (grade > 60)
		cout << "pass";
	else
		cout << "fail";
	return 0;
}

4.23

string s = "word";
string s1 = s + s[s.size() - 1] == 's' ? "" : "s" ;
加法运算符优先级高于相等运算符
修改: string s1 = s + (s[s.size() - 1] == 's' ? "" : "s");

4.24

首先判断grade > 90,大于则为pass,不大于则为(grade > 60), 根据值选择其中一个作为后面的判断。

4.25

首先字符q的二进制会被扩展成32位,然后左移6位。则为7232

4.26

无法确保测试条件成立

4.27

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

4.28

 #include
using namespace std;

int main()
{
	char a = 's';
	int i = 1;
	double f = 3.14;
	long q = 12;
	float t = 2.5;
	cout << sizeof(a) << " " << sizeof(i) << " " << sizeof(f)
		<< " " << sizeof(q) << " " << sizeof(t) << endl;
	return 0;
}

4.29

int x[10]; int *p = x;
cout << sizeof(x) / sizeof(*x) << endl;     //  10
cout << sizeof(p) / sizeof(*p) << endl;    //  1

C++ Primer(5e)第4章习题_第1张图片

4.30

(a)(sizeof x) + y
(b)sizeof (p->mem[i])
(c)(sizeof a) < b
(d)sizeof (f())

4.31

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

4.32

constexpr int size = 5;
int ia[size] = { 1, 2, 3, 4, 5 };
for (int *ptr = ia, ix = 0; ix != size && ptr != ia + size; ++ix, ++ptr)
遍历ia数组中的每个元素

4.33

someValue ? ++x, ++y : --x, --y;
判断someValue是否为0,是就递增x,y,不是就递减x,y

4.34

(a)float转化成bool
(b)int转化为float,然后float转化为double
(c)char转化为int,然后int转化为double 

4.35

(a)int转化为char
(b)int转化为doubleunsigned int 转为为double
(c)unsigned int 转化为float,float转化为double
(d)int转化为floatfloat转化为doubledouble转化为char

4.36

int 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;
(d) pc = static_cast<char*>pv;

4.38

把j / i 的值强制转化为double类型

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