到目前为止,程序都是从上往下一行行执行。但真正的程序需要"判断"和"重复"。本章讲两种控制流:条件(if/else/switch)和循环(for/while)。
5.1 if 语句:根据条件做选择
if让程序"如果条件成立,就做某事":
intscore=85;if(score>=60){std::cout<<"及格了!"<<std::endl;}语法结构:
if(条件){// 条件为 true 时执行这里}(条件)里是一个结果为bool的表达式(如score >= 60)。{ }里是条件成立时要执行的语句。
5.2 if-else:二选一
if(score>=60){std::cout<<"及格"<<std::endl;}else{std::cout<<"不及格"<<std::endl;}else是"否则"——条件不成立时执行。
5.3 if-else if-else:多分支
if(score>=90){std::cout<<"优秀"<<std::endl;}elseif(score>=70){std::cout<<"良好"<<std::endl;}elseif(score>=60){std::cout<<"及格"<<std::endl;}else{std::cout<<"不及格"<<std::endl;}程序从上往下依次判断,遇到第一个成立的就执行并跳出,后面的不再判断。
5.4 嵌套 if
if里面可以再放if:
if(score>=60){if(score>=90){std::cout<<"优秀且及格"<<std::endl;}}提示:花括号
{}能让结构清晰。即使只有一条语句,也建议写{},避免出错。
5.5 switch 语句:等值多分支
当要判断一个变量"等于哪个具体值"时,switch比一堆else if更清晰:
intday=3;switch(day){case1:std::cout<<"星期一"<<std::endl;break;case2:std::cout<<"星期二"<<std::endl;break;case3:std::cout<<"星期三"<<std::endl;break;default:std::cout<<"其他"<<std::endl;}要点:
case 值:匹配某个具体值- 每个
case末尾要写break;(跳出 switch,否则会"穿透"继续执行下一个 case) default:是"都不匹配时"执行的兜底
5.6 while 循环:满足条件就重复
while循环:只要条件为 true,就不断重复执行循环体。
inti=0;while(i<5){std::cout<<i<<" ";i++;// 关键:一定要改变条件变量,否则死循环}// 输出:0 1 2 3 4执行过程:先检查i < 5,成立就执行循环体(打印并i++),再回来检查,直到i变成 5 不满足条件,退出。
死循环警告:如果忘了
i++,i < 5永远成立,程序会一直转下去卡死。写循环时务必确保条件最终会变成 false。
5.7 for 循环:最常用的循环
for把"初始化、条件、更新"三件事写在一起,最紧凑:
for(inti=0;i<5;i++){std::cout<<i<<" ";}// 输出:0 1 2 3 4结构拆解:
for(①初始化;②条件;④更新){③循环体}执行顺序是:① → ②(真)→ ③ → ④ → ②(真)→ ③ → ④ → … 直到 ② 为假。
- ①
int i = 0:循环变量,只执行一次 - ②
i < 5:每次循环前检查 - ④
i++:每次循环后更新
常见 for 循环用法
// 累加 1 到 100intsum=0;for(inti=1;i<=100;i++){sum+=i;}std::cout<<"1+...+100 = "<<sum<<std::endl;// 5050// 打印 2 的倍数for(inti=2;i<=10;i+=2){std::cout<<i<<" ";// 2 4 6 8 10}5.8 do-while 循环:先做再判断
do-while和while的区别:先执行一次,再判断,所以至少执行一次。
inti=0;do{std::cout<<i<<" ";i++;}while(i<5);// 输出:0 1 2 3 4实际用得较少,了解即可。
5.9 break 和 continue
在循环里有两个控制关键字:
break:立刻跳出整个循环。continue:跳过本次循环剩下的部分,直接进入下一次循环。
// break:找到第一个偶数就停止for(inti=1;i<=10;i++){if(i%2==0){std::cout<<"第一个偶数是 "<<i<<std::endl;// 2break;}}// continue:只打印奇数(跳过偶数)for(inti=1;i<=10;i++){if(i%2==0)continue;// 偶数跳过std::cout<<i<<" ";// 1 3 5 7 9}5.10 完整示例:九九乘法表
#include<iostream>intmain(){for(inti=1;i<=9;i++){// 外层循环:行for(intj=1;j<=i;j++){// 内层循环:列std::cout<<j<<"x"<<i<<"="<<i*j<<"\t";}std::cout<<std::endl;// 一行结束换行}return0;}运行会打印出完整的九九乘法表。这段代码展示了嵌套循环:外层走一行,内层把这一行的每列都走一遍。
实际输出(每两个算式之间是一个制表符\t,这里用空格对齐):
1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81数一数就能看出规律:第i行正好有i个算式,因为内层循环的条件是j <= i。
5.11 小结
- 条件:
if/if-else/else if/switch。 - 循环:
while(先判断)、for(最常用)、do-while(先执行)。 break跳出循环,continue跳过本次。- 写循环注意避免死循环(条件最终要为 false)。
下一章,学习把代码封装成函数,让代码更清晰、可复用。
练习题
- 写程序:输入(或定义一个)成绩,输出等级(优/良/及格/不及格)。
- 用 for 循环打印 1 到 100 之间所有偶数。
- 用 while 循环计算 1+2+…+n(n=100)。
- 打印九九乘法表(运行上面的示例,理解嵌套循环)。
- 写程序判断一个数是不是质数(只能被 1 和自己整除)。