《C++ Primer》第五版课后习题解答_第四章(2)(21-33)

来源:互联网 发布:js事件绑定on 编辑:程序博客网 时间:2024/05/21 14:08

系统环境: 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)

阅读全文
0 0
原创粉丝点击