程序的运行有三种主要的结构,在我们之前写的程序里,代码都是从上到下依次执行的,这就是最为简单的 顺序结构。
然而,在更多的情况下,程序的执行并不都是平平顺顺的。
就像人们走路一样,有的时候会有岔路口,需要做一下判断,我们应该走那条路,这就是程序运行的 选择结构。
有的时候又像逛商场,需要绕上好几圈来挑选商品,这就是程序运行的 循环结构。
选择结构和循环结构,我们在 C 语言中都讲过,C++ 的选择和循环与 C 语言是完全一致的,可以参见这两篇文章:
选择结构:
循环结构:
今天,我们学习 C++ 的流程控制,会补充介绍一些之前没有涉及到的内容。
我们看一份简单的含有选择结构的代码:
#include <iostream>
using namespace std;
int main() {
int x, y;
char o;
cin >> x >> y >> o;
if (o == '+') {
cout << "x + y = " << x + y << endl;
}
return 0;
}
/*
input:
123 456 +
output:
x + y = 579
*/
这份代码的含义很简单,接收用户输入的两个数和一个运算符,如果运算符是 +,就输出两个数的和。
如果我们进一步要求,对于加减乘除和模运算都可以进行计算并输出结果,应该怎么做?
当然,我们都知道,这个用 if...else if...else 结构也可以实现,判断五种情况就可以了。
但在这种情况下,更加推荐使用 C++ 的另外一种选择结构,就是 多分枝选择结构 switch...case,它通常比 if 执行的快,并且代码更加清晰易读。
以下是使用 switch...case 实现的过程:
#include <iostream>
using namespace std;
int main() {
int x, y;
char o;
cin >> x >> y >> o;
switch (o) {
case '+':
cout << "x + y = " << x + y << endl;
break;
case '-':
cout << "x - y = " << x - y << endl;
break;
case '*':
cout << "x * y = " << x * y << endl;
break;
case '/':
cout << "x / y = " << x / y << endl;
break;
case '%':
cout << "x % y = " << x % y << endl;
break;
default:
cout << "operator is error." << endl;
break;
}
return 0;
}
/*
input:
99 79 %
output:
x % y = 20
*/
这样,我们就实现了关于 x 和 y 的五种运算。
或许你已经注意到了,在每一个 case
的后面,都有一个 break
,它的含义是终止或中断。
一旦当前 case
内部的代码执行完成,遇到了 break
就会退出这个 switch...case
结构,这个关键字我们一会还会提到。
另外一个地方就是在最后,我们使用了一个关键字 -default
,它表示以上 case
都不匹配时,我们的所做的处理。
良好的编程风格建议在 switch...case
的最后都要写上这个 default
。
我们先来看一份 while
循环的代码:
#include <iostream>
using namespace std;
int main() {
int n = 0;
while (n < 10) {
cout << n << endl;
n++;
}
return 0;
}
/*
output:
0
1
2
3
4
5
6
7
8
9
*/
啊,这份程序很简单,输出了 0~9 十个数字。
我们用另外一种特殊的 do...while
循环来实现同样的代码:
#include <iostream>
using namespace std;
int main() {
int n = 0;
// do...while 循环
do {
cout << n << endl;
n++;
} while (n < 10);
return 0;
}
/*
output:
0
1
2
3
4
5
6
7
8
9
*/
结果虽然还是完全一样的,但循环的结构变了,do...while
循环的逻辑是,先执行 do
后语句块的内容,在最后的 while
内进行判断,根据判断的结果看是否进行下一次循环。
这个 do...while
和 while
有什么不一样吗,两次的结果不都是相同的吗?
当然有不同,不然 do...while
没有必要出现了。
现在,我们把n
的初值改为 10,对 while
循环,第一次条件就不满足,直接退出循环,没有任何输出。
而对于 do...while
而言,因为是后做判断,所以先输出了一个 0,之后退出了循环。
所以,do...while
的特点就是:无论条件是否满足,循环体至少执行一次。
这种结构用的不多,但在特定的场景下有用武之地。
break
和 continue
最后,我们学习两个在循环中会用到的两个关键字。
首先是 break
,我们刚刚在多分枝选择结构 switch...case
中说到了,它的含义是中断或终止。
break
用在循环中,就是直接退出循环的作用:
#include <iostream>
using namespace std;
int main() {
int n = 0;
while (n < 10) {
n++;
if (n == 5) {
break;
}
cout << n << endl;
}
return 0;
}
/*
output:
1
2
3
4
*/
当 n 为 5 时,进入 if
执行了 break
,它的作用是终止这一个循环,直接退出。
至于 continue
的作用是什么,我们再来看:
#include <iostream>
using namespace std;
int main() {
int n = 0;
while (n < 10) {
n++;
if (n == 5) {
continue;
}
cout << n << endl;
}
return 0;
}
/*
output:
1
2
3
4
6
7
8
9
10
*/
我们仅仅把 break
替换为 continue
,输出的结果发生了很大的变化:只有 5 没有输出。
所以 continue
的作用就是终止这一次循环,从下一次继续开始。
只要理解并记住了 这一次 和 这一个 的含义和区别,break
和 continue
就不难理解了。