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