1. 选择结构
选择结构用于判断给定条件,通过判断的结果来决定下一步的执行流程。
常见的选择结构有单分支选择结构、双分支选择结构、多分支选择结构以及嵌套的分支结构
2. 选择结构的使用
2.1 单分支选择结构
语法结构
if(表达式)
语句;
执行流程
示例:判断一个数是否为偶数
intmain() { intinput=0; printf("请输入一个数"); scanf("%d", &input); //判断输入的数是否为偶数if (input%2==0) //若不加花括号则默认只执行if语句后面一条语句 { printf("输入的数为偶数\n"); } return0; }
2.2 双分支选择结构
语法结构
if(表达式)
语句1;
else
语句2;
执行流程
示例:判断一个数是偶数还是奇数
intmain() { intinput=0; printf("请输入一个数"); scanf("%d", &input); //判断输入的数是否为偶数if (input%2==0) { printf("输入的数为偶数\n"); } else { printf("输入的数为奇数\n"); } return0; }
注:
if 和 if else 语句,后面可以不写{},此时只会执行if else后面一条语句
//代码1if (condition) returnx; returny; //代码2if (condition) { returnx; } else { returny; }
代码1和代码2的执行结果是相同的,相比之下,代码2逻辑更加清晰,且不容易出错
{}可以执行代码块内多条语句,且代码的逻辑更加清楚建议在使用时都加上{}
2.3 多分支选择语句
2.3.1 通过else if实现多分支选择语句语法结构
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
else
语句4;
执行流程
示例:判断一个数是正数、负数还是0
intmain() { intnum=0; printf("请输入一个数"); scanf("%d", &num); if (num>0) { printf("输入的数为正数\n"); } elseif (num<0) { printf("输入的数为负数\n"); } else { printf("输入的数为0\n"); } return0; }
注:
1. 选择结构是从上到下匹配的,一旦匹配上某个条件后,整个条件语句就结束了,
即使后面也能匹配上条件也不会再执行了 。
2. 使用if else if后可以不写 else
2.3.2 switch语句实现多分支选择语句 switch语句常常应用于多分支的情况。
当分支较多时,使用else if语句的形式就比较复杂,此时,我们可以使用switch语句来实现
语法结构
switch(整形表达式){
case 常量表达式1: 语句1;
语句2;
...
break;
case 常量表达式2:
语句1; ...
break;
case 常量表达式3:
语句1
...
break; default:
default语句
break;
}
在计算整形表达式的值后,将得到的值逐个与每个case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,即执行后面的语句,直到遇到break语句为止。。若表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
(default相当于else,与上述所有条件都匹配不上时,就执行default)
示例1:
intmain() { intday=0; scanf("%d", &day); switch (day) { //若不加break,则会向下执行后面的语句,直到遇见breakcase1: printf("星期一\n"); case2: printf("星期二\n"); case3: printf("星期三\n"); case4: printf("星期四\n"); case5: printf("星期五\n"); break; case6: printf("星期六\n"); case7: printf("星期天"); default: printf("输入错误!\n"); } return0; }
运行结果
示例2:
intmain() { intday=0; scanf("%d", &day); switch (day) { case1: case2: case3: case4:; case5: printf("工作日\n"); break; case6: case7: printf("周末\n"); break; default: printf("输入错误!\n"); break; } return0; }
注:
1. switch语句与if语句不同,它仅能判断表达式的值是否等于指定的常量,而 if 可以计算并判断各种表达式
2. switch语句后必须为整形表达式
3. 在一个 switch 中可以有任意多的 case 语句,case后必须为常量4. default可以省略
5. case和default顺序可以颠倒,颠倒时要注意后面的break语句。
6. 建议在最后一个 case 语句的后面也加上一条 break语句,以避免添加新的case语句时,之前最后一个 case 语句后面忘了添加 break语句。
2.4 嵌套的分支语句
switch语句和if-else语句都可以嵌套使用
执行流程
示例1:
intmain() { doublescore=0.0; printf("请输入分数"); scanf("%d", &score); if (score>=0.0&&score<=100) { if (score>=85) { printf("优秀\n"); } elseif (score>=75) { printf("良好\n"); } elseif (score>=60) { printf("及格\n"); } else { printf("不及格\n"); } } else { printf("输入错误!\n"); } return0; }
示例2:
intmain() { inta=0; intb=5; if (a>0) if (b>0) printf("b = %d", b); elseprintf("a = %d", a); return0; }
运行结果
注:C 语言规定了 if和else的就近匹配原则,即else和它上面的最近的没有配对的if配对,与书写格式无关
在执行语句后面都加上{},匹配的if else保持相同的缩进,可以使逻辑更加清晰,且不容易出错
示例3:
intmain() { inta=2; intb=3; switch (a) { case1: printf("a = 1\n"); break; case2: printf("a = 2\n"); switch (b) { case1: printf("b = 1\n"); break; default: printf("b != 1\n"); break; } break; default: break; } return0; }