练习5.1
什么是空语句?什么时候会用到空语句?
最简单的语句是空语句,空语句只有一个单独的分号:
;//null statement
如果在程序的某个地方,语法上需要一条语句但逻辑上不需要,此时应该使用空语句。
练习5.2
什么是块?什么时候会用到块?
复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称作块。
如果在程序的某个地方,语法上需要一条语句,但是逻辑上需要多条语句,则应使用复合语句。
练习5.3
使用逗号运算符重写1.4.1节的 while 循环,使它不再需要块,观察改写之后的代码可读性提高了还是降低了。
#include <iostream>
int main()
{
int sum = 0, val = 1;
while (val <= 10)
sum += val, ++val;
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
可读性降低了
练习5.4
说明下列例子的含义,如果存在问题,试着修改它。
(a) while (string::iterator iter != s.end()) {
/* . . . */ }
(b) while (bool status = find(word)) {
/* . . . */ }
if (!status) {
/* . . . */ }
(a)
std::string::iterator iter = s.begin();
while (iter != s.end()) {
/* . . . */ }
(b)
bool status;
while (status = find(word)) {
/* ... */}
if (!status) {
/* ... */}
练习5.5
写一段自己的程序,使用if else 语句实现把数字转换为字母成绩的要求。
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
using std::cout;
using std::endl;
using std::cin;
int main()
{
vector<string> scores = {
"F", "D", "C", "B", "A", "A++"};
int grade{
0};
while (cin >> grade) {
string lettergrade;
if (grade < 60)
lettergrade = scores[0];
else {
lettergrade = scores[(grade - 50) / 10];
if (grade != 100) {
if (grade % 10 > 7)
lettergrade += "+";
else if (grade % 10 < 3)
lettergrade += "-";
}
}
cout << lettergrade << endl;
}
return 0;
}
练习5.6
改写上一题的程序,使用条件运算符代替if else语句。
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
using std::cout;
using std::endl;
using std::cin;
int main()
{
vector<string> scores = {
"F", "D", "C", "B", "A", "A++"};
int grade{
0};
while (cin >> grade) {
string lettergrade = grade < 60 ? scores[0] : scores[(grade - 50) / 10];
lettergrade +=
(grade == 100 || grade < 60)
? ""
: (grade % 10 > 7) ? "+" : (grade % 10 < 3) ? "-" : "";
cout << lettergrade << endl;
}
return 0;
}
练习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) if (ival1 != ival2)
ival1 = ival2;
else ival1 = ival2 = 0;
(b) if (ival < minval)
{
minval = ival;
occurs = 1;
}
(c) int val;
if (ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0\n";
(d) if (ival == 0)
ival = get_value();
练习5.8
什么是“悬垂else”?C++语言是如何处理else子句的?
当一个if语句嵌套在另一个if语句内部时,很可能if分支会多于else分支。这时候我们怎么知道某个给定的else是和哪个if匹配呢。这个问题通常称作悬垂else。就C++而言,它规定else与离它最近的尚未匹配的if匹配的if匹配,从而消除了程序的二义性。
练习5.9
编写一段程序,使用一系列if语句统计从cin读入的文本中有多少元音字母。
#include <iostream>