练习5.4
说明下列例子的含义,如果存在问题,试着修改它
(a) while(string::iterator iter != s.end()){/*...*/}
(b) while(bool status = find(word)) {/* .. */}
if(!status){/* ... */}
解答:
(a) 每次创建迭代器,并确定它不为end()。while的括号中应该是一个赋值语句,而不是判定语句。
while(string::iterator iter = s.begin(), iter != s.end()){/*...*/} (其中begin只是做个例子,并不一定代表表达式的原始意义)
(b) 每次试图查找某个词,在这个词被找到的时候,再做一系列操作。
while(bool status = find(word)) {
if(!status){/* ... */}
// ...}
练习5.5
写一段自己的程序,使用if else语句实现把数字成绩转换为字母成绩的要求。
解答:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string res[3] = { "fail", "pass", "high pass" };
int main(){
int grade;
while (cin >> grade){
if (grade > 90){
cout << res[2] << endl;
}
else{
cout << res[grade / 60] << endl;
}
}
}
练习5.6
改写上一题的程序,使用条件运算符,代替if else语句。
解答:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string res[3] = { "fail", "pass", "high pass" };
int main(){
int grade;
while (cin >> grade){
grade > 90 ? (cout << res[2] << endl) : (cout << res[grade / 60] << endl);
}
}
练习5.7
改正下列代码段中的错误
(a) if (ival1 != ival2)
ival1 = ival2
else ival1 = ival2 = 0;
(b) if (ival < minval)
minval = ival;
occurs = 1;
(c) if (int ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0 \n";
(d) if (ival = 0)
ival = get_value();
解答:
(a) 第二行缺少分号
(b) 第二行和第三行应该用大括号括起来
(c) ival不能再第二个if中使用
(d) 这段没什么错误。不过if语句中的代码永远不会被执行
练习5.8
什么是“悬垂else”?C++语言是如何处理else子句的?
解答:
【引用】确定else是和哪个if进行匹配的问题,通常称为“悬垂else”
【引用】C++规定else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。