C++Prime第四章

C++Prime第四章练习题,自己做的答案,不对之处恳请批评指正。

练习4.1

结果是:105

练习4.2

(a)  *vec.begin()   == *(vec.begin())

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

练习4.3

不可接受。有些错误隐蔽不好发现。

练习4.4

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

#include <iostream>
using namespace std;
int main()
{
	cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 << endl;
	cout << ((((12 / 3) * 4) + (5 * 15)) + ((24 % 4) / 2)) << endl;
	return 0;
}

练习4.5

(a) -30 * 3 + 21 / 5 = -86                                      (b) -30 + 3 * 21 / 5   = -18

(c) 30 / 3 * 21 % 5 = 0                                      (d)  -30 / 3 * 21 % 4 =  -2

练习4.6

num % 2 == 0  表达式值为1则为偶数,为0则为奇数

练习4.7

超出了数据的表示范围。

int a  = 100000000000000000000000000;         

练习4.8

&& 左侧不满足则直接表达式值为0,左侧满足才判断右侧。。。。

||    左侧满足则直接表达式值为1,左侧不满足才判断右侧。

相等性运算符        从左至右

练习4.9

cp不是空指针时,才会对cp解引用。

练习4.10

#include <iostream>
using namespace std;
int main()
{
	int num;
	while (cin >> num && num != 42)
		cout << num << endl;
	return 0;
}

练习4.11

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

练习4.12

i != (j < k)

练习4.13

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

练习4.14

if (42 = i)  //  报错

if (i = 42) // 一直为真

练习4.15

不能把指针(int *)赋值给int

练习4.16

修改后:

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

练习4.17 

前置递增运算符比后置递增运算符 少了一个copy的操作。

练习4.18

不会输出第一个元素。会输出超尾,越界。

练习4.19

(a)  ptr != 0  && *ptr++                 错误,会有越界错误。

(b)  ival++   &&  ival                     正确。首先判断ival是否为0,然后判断ival + 1 是否为0

(c)  vec[ival++] <= vec[ival]          错误。求值顺序不确定,会产生未定义。                      

练习4.20

(a) *iter++    保存iter所指对象的副本,然后把iter指向下一位置,然后对刚保存副本解引用

(b) (*iter)++  非法。先取对象,然后加一,但是对string对象加一无效

(c) *iter.empty()  非法。iter是指针,无成员。且不能对bool值解引用。

(d) iter->empty()   间接引用

(e) ++*iter   非法。先取对象,然后加一。对string对象+1是非法的。

(f) iter++->empty()  判断iter所指对象空没空,然后iter指向下一位置。

练习4.21

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> vi;
	int num;
	while (cin >> num)//read data
		vi.push_back(num);

	for (auto x : vi)//show data
		cout << x << " ";
	cout << "\nAfter change: "<<endl;

	for (auto& x : vi)//change
		x = x % 2 == 0 ? x : 2 * x;

	for (auto x : vi)//show data
		cout << x << " ";
	return 0;
}

练习4.22

对条件运算符嵌套即可,不如if-else容易理解。

练习4.23

+优先级高于 == ,修改: p1 = s + (....);  // 加个括号呗

练习4.24

将会编译错误

练习4.25

‘q’ = 01110001  ~'q' = 11..11110001110  左移6位,得111..1110001110000000

练习4.26

如果unsigned int 不是32位,那么学生将永远通不过测验

练习4.27

3 == 000...00 0011                  7 == 000...00 0111

(a) ul1 & ul2 = 000...0000011 = 3

(b) ul1 | ul2  = 000...00 0111 = 7

(c) ul1 && ul2 = 1

(d) ul1 || ul2 = 1

练习4.28

#include <iostream>
#include <typeinfo>
#include <vector>
using namespace std;
template<typename T>
void print(T t)
{
	cout << typeid(T).name() << "所占字节是: " << sizeof(T) << endl;
}
int main()
{
	char c = 'a';print(c);
	short s = 0;  print(s);
	int i = 0; print(i);
	unsigned ui = 0; print(ui);
	long l = 0; print(l);
	long long ll = 0; print(ll);
	enum  e { red }; print(red);
	int* p = nullptr; print(p);
	return 0;
}

练习4.29

10   1

sizeof(array) == 数组所占字节总和 == 数组大小

sizeof(pointer) == 指针实际指向的数据的大小

练习4.30

(a) sizeof (x + y)   (b) sizeof (p->mem[i])

(c) (sizeof a) < b   (d) sizeof f()

这题感觉有问题,表达式本来的含义不好琢磨。尤其是(a)

练习4.31

递增/减运算符后置版本存在一个复制原始值从而保留一个副本的步骤。

在逗号运算符表达式中,逗号左侧的值被丢弃,所以逗号左侧如果是递增运算符的后置版本,那么就复制了副本,又把副本丢弃,做无用功。

改动: 前改为后就是了。

练习4.32

遍历数组

练习4.33

原式 = (someValue ? ++x,++y : --x), --y

难点在于辨认第二个逗号到底是:?的一部分,还是单独的一个逗号表达式

练习4.34

(a) if(fval)   float转换成bool

(b) dval = fval + ival  int和float都被转换为double

(c) dval + ival * cval  char被转换成int,然后int都被转换成double

4.35 略

练习4.36

#include <iostream>
using namespace std;

int main()
{
	int i = 2;
	double d = 2.4;
	i *= static_cast<int>(d);
	cout << i << endl;
	return 0;
}

练习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类型,赋给slope

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值