4.17 前置版本:先将运算对象加1,将改变后的对象作为求值结果;后置版本:将运算对象加1,但求值结果是运算对象改变之前的那个值的副本。
4.18 使用前置,pbeg先加1,再解引用,无法输出第一个元素,而且最后会越界。
4.19 (a)先判定ptr是否有效,有效则判定ptr指向的值是否为0,并递增ptr;
(b)先判定ival是否为0,非0则继续检查(ival + 1)的值是否为0;如果改变了某个运算对象的值,再表达式其他地方不要再使用这个运算对象;
(c)比较vec[ival]和vec[ival+1]的大小,是不好的写法,原因同(b)。
4.20 (a)合法,先解引用iter,再自增iter;
(b)非法,(*iter)得到一个string,string没有后置递增操作;
(c)非法,应该为iter->empty()或(*iter).empty();
(d)合法;
(e)非法,解引用iter得到string,string没有前置递增操作;
(f)合法,先判定当前字符串是否为空,再自增iter。
4.21
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (auto &i : ivec)
i = (i % 2)? i*2 : i;
for (auto i : ivec)
cout << i << " ";
cout << endl;
return 0;
}
4.22 条件运算符版本:
#include <iostream>
using namespace std;
int main()
{
unsigned grade;
string finalgrade;
while (cin >> grade) {
finalgrade = (grade > 90)? "high pass"
: (grade < 60)? "fail"
: (grade < 75)? "low pass": "pass";
cout << finalgrade << endl;
}
return 0;
}
if语句版本:
#include <iostream>
using namespace std;
int main()
{
unsigned grade;
string finalgrade;
while (cin >> grade) {
if (grade > 90) {
finalgrade = "high pass";
} else if (grade > 75) {
finalgrade = "pass";
} else if (grade < 60) {
finalgrade = "fail";
} else {
finalgrade = "low pass";
}
cout << finalgrade << endl;
}
return 0;
}
4.23 题目意图是判断字符串是否以's'结尾,如果是,不做处理,如果不是则添加s。题目中运算优先级次序:加法,相等,条件,赋值,改写法将s加上s[s.size() - 1],得到一个新字符串,再与字符's'比较是否相等,类型不匹配,导致无法通过编译。修改为:
string p1 = s + (s[s.size() - 1] == 's'? "" : "s");
4.24 如果为左结合,表达式 等价于:finalgrade = ((grade > 90)? "high grade" : (grade < 60)) ? "fail" : "pass"; 如果 grade > 90不成立,表达式值就成为grade < 60,无法通过编译。
4.25 ~‘q’: 11111111 11111111 11111111 10001110;
~'q' << 6: 11111111 11111111 11100011 10000000
4.26 unsigned int所占空间最少为16,在某些环境中无法存放全部信息。
4.27 (a) 3; (b) 7; (c)true; (d)true
本文详细解答了C++ Primer第五版的4.17至4.27节的练习题,涵盖了前置与后置递增运算符的使用、指针与迭代器的操作、条件运算符的理解、字符串处理和位操作等多个知识点,旨在帮助读者深入理解C++中的这些核心概念。

1988

被折叠的 条评论
为什么被折叠?



