概述
系统环境: 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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复