继续记录我的C++ 学习之路,本文是第四章的练习题,第三章的链接在这里:
练习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要倒了.........救命,加把劲干完啊啊啊啊啊啊啊。