第四章 4.6节练习 & 4.7节练习

来源:互联网 发布:node readline 编辑:程序博客网 时间:2024/06/05 11:00

练习4.20

假设iter的类型是vector<string>::iterator,说明下面的表达式是否合法。如果合法,表达式的含义是什么?如果不合法,错在何处?

(a) *iter++

(b) (*iter)++

(c) *iter.empty()

(d) iter->empty()

(e) ++*iter

(f) iter++->empty();

解答:

(a) 合法。使用当前迭代器指向的字符串,并将迭代器做向后偏移的操作

(b) 合法。使用当前迭代器指向的字符串,并将该数自加1

(c) 非法。‘.’操作符要比*操作符的优先级高,但是iter不是一个string对象

(d) 合法。查看当前迭代器指向的字符是否为空

(e) 非法。这里先对iter进行解引用,在对对象进行自加操作。不过string对象不支持自加操作符

(f) 合法。先判断当前迭代器指向的字符是否为空,然后对迭代器做偏移操作。


练习4.21

编写一段程序,使用条件运算符从vector<int>中找到哪些元素是基础,然后将这些奇数翻倍。

解答:

#include <iostream>#include <vector>using namespace std;int main(){vector<int> ivec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (auto i : ivec){cout << ((i % 2) ? i * 2 : i) << endl;}}

练习4.22

本节的示例程序将成绩划分成high pass、pass和fail三种,扩展该程序使其进一步将60分到75分之间的成绩设计成low pass。要求程序包含两个版本:一个版本只使用条件运算符;另外一个版本使用1个或多个if语句。那个版本更容易理解呢?为什么?

解答:

string finalgrade = grade > 90 ? "high pass" : (grade < 60) ? "fail" : (grade > 75) : "low pass" : "pass";
if (grade > 90){finalgrade = "high pass";}else if (60 < grade && grade < 75){finalgrade = "low pass";}else if (grade < 60){finalgrade = "fail";}else{finalgrade = "pass";}
这里肯定是if语句的好理解。

层次很分明,看的很清楚。


练习4.23

因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表指出它的问题在哪里?应该如何修改?

string s = "word";

string pl = s + s[s.size() -1] == 's'? "" : "s";

解答:

这里+运算符的优先级要比==号高。

string pl = s + (s[s.size() -1] == 's'? "" : "s");


练习4.24

本节的示例程序将成绩划分成high pass、pass和fail三种,他的依据是条件运算符满足右结合律。假如条件运算符满足的是左结合律,求值过程将是怎样的?

解答:

会从表达式的尾部开始进行条件判断。最后判断grade>90,结果和之前没有区别。

0 0
原创粉丝点击