《C++ Primer》第五版课后习题解答_第四章(2)(21-33)
系统环境: windows 10 1703
编译环境:Visual studio 2017
4.21
#include <iostream> #include <vector> using std::cout; using std::endl; using std::vector; int main() { vector<int> ivec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (vector<int>::size_type i = 0; i != ivec.size(); ++i) { ((ivec[i] % 2) == 0) ? ivec[i] = ivec[i] : ivec[i] *= 2; } for (auto a : ivec) { cout << a << " "; } cout << endl; return 0; }
4.22
#include <iostream> #include <string> using std::cout; using std::endl; using std::cin; using std::string; int main() { int grade; string finalgrade; cin >> grade; // 条件运算符 finalgrade = (grade > 90) ? "hide pass" : (75 > grade && grade > 60) ? "low pass" : (grade < 60) ? "fail" : "pass"; // if 语句 if (grade > 90) { finalgrade = "high pass"; } else if (75 > grade && grade > 60) { finalgrade = "low pass"; } else if (grade < 60) { finalgrade = "fail"; } else { finalgrade = "pass"; } cout << finalgrade << endl; return 0; }if 版本的更容易理解,因为每个判断条件及其执行语句都是分开写的。然而从简便性上来说,条件运算符用了更少的行数。
4.23
原表达式,会先计算 s + s[s.size() - 1] ,再用其结果执行其后的条件运算符。应该修改为:
string pl = s + ((s[s.size() - 1] == 's') ? "" : "s");
4.24
如果条件运算符满足左结合律,则原式
finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass"
的计算过程如下:
finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass"
如果 grade 大于90,第一个条件运算符的返回值是 high pass,这个值又被当作下一个条件运算符的条件,当非空字符串被当做布尔值时,其为 1,所以 finalgrade 的值最终为 fail。
4.25
11111111111111111110001110000000
先将 'q' 取反,则先被提升为 int 类型(32位),再逐位求反,然后左移六位。
4.26
unsigned int 的最小长度为 16 位,例子中若想保存所有学生的成绩,至少需要 32 位,故其结果应为未定义行为(undefined behavior)
4.27
(a) 3
(b) 7
(c) true
(d) true
4.28
#include <iostream> using std::cout; using std::endl; int main() { // 以 p30 算数类型表为例 cout << "bool " << sizeof(bool) << endl; cout << "char " << sizeof(char) << endl; cout << "wchar_t " << sizeof(wchar_t) << endl; cout << "char16_t " << sizeof(char16_t) << endl; cout << "char32_t " << sizeof(char32_t) << endl; cout << "short " << sizeof(short) << endl; cout << "int " << sizeof(int) << endl; cout << "long " << sizeof(long) << endl; cout << "long long " << sizeof(long long) << endl; cout << "float " << sizeof(float) << endl; cout << "double " << sizeof(double) << endl; cout << "long double " << sizeof(long double) << endl; return 0; }输出为
bool 1
char 1
wchar_t 2
char16_t 2
char32_t 4
short 2
int 4
long 4
long long 8
float 4
double 8
long double 8
4.29
第一个表达式输出结果为 10,其计算的是数组 x 中的元素数量;
第二个表达式输出结果不定,因为其计算的是指针本身的大小,其值由机器决定。
4.30
(a) (sizeof x) + y
(b) sizeof (p -> mem[i])
(c) (sizeof a) < b
(d) sizeof (f())
4.31
本书 p132 指出,除非必须,否则不用递增递减运算符的后置版本。建议养成使用前置版本的习惯。
若使用后置版本的递增递减运算符,无需做改动。
4.32
ptr 指向数组的开头,ix 表示下标。
当下标 ix 不等于数组长度,且指针不为尾后指针时,执行循环。
4.33
根据逗号运算符的求值顺序,题中表达式可等价为:
(someValue ? ++x, ++y : --x), --y当 someValue 为真时,计算 ++x,返回 ++y;
当 someValue 为假时,计算 --x,返回 --y;
由上述分析可知,其和下述表达式等效:
someValue ? (++x, ++y) : (--x, --y)