练习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,结果和之前没有区别。