我是靠谱客的博主 踏实金毛,最近开发中收集的这篇文章主要介绍《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)

转载于:https://www.cnblogs.com/Adam-fei/p/7899751.html

最后

以上就是踏实金毛为你收集整理的《C++ Primer》第五版课后习题解答_第四章(2)(21-33)的全部内容,希望文章能够帮你解决《C++ Primer》第五版课后习题解答_第四章(2)(21-33)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部