3.2.1 嵌套的if-else
之前我们比较过两个数的大小,那么如何比较三个数的大小?
可以先比较两个数的大小,胜出者再去和第三个数比较,其算法图解为:
#include <stdio.h>
int main()
{
int a, b, c;
int max = 0;
printf("请输入三个整数:");
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
max = a;
if (a > c)
max = a;
else
max = c;
}
else
{
max = b;
if (b > c)
max = b;
else
max = c;
}
printf("%d", max);
}
当if的条件满足/不满足的时候要执行的语句也可以是一条if或者if-else语句。这就是嵌套的if语句
那么else的匹配机制是什么呢?else总是与最近的那个if相匹配。 C中缩进不暗示相匹配。只有大括号能改变匹配模式。为了避免错误,可以在每个if、else要执行的语句加上大括号,
3.2.2 级联的else if
else if 和if-else可不是一回事,引入一个分段函数的小例:x>0时候y=1,<0时候=-1,=0时候=0。
if(x>0)
y=1;
else if(x<0)
y=-1;
else
y=0;
可以看到,else if提供了多分支选择的条件。现在我们编写比较大小或者部分嵌套条件的程序时就可以采用这种方法来写了。需要注意的是:else if相当于是在第一个分支中的else部分内部嵌套了一个if-else语句,所以else if后面必须要写上条件。
放一个程序对比:
左边的程序实现了单一出口,也就是f事先定好就是用来做某个输出用途的,而右边的输出值是不固定的,不便于维护和查错。
3.2.3 if-else的常见错误
- 忘写大括号{}
- if条件后面加了分号
- 错误使用=和==
- else匹配
此时printf语句不会执行
此时整个{}内的语句都不会执行,因为分号让整个语句结束了。
条件出错,()里可以是表达式,但是结果必须是0或1,正确的应该把=改为==,a==b才是做判断。
像前文说的,每个要执行的部分都加上大括号,就不会出现else匹配错误的情况了。
3.2.4 多路分支
我们当然可以用已经学过的知识点:else if写出多路分支的选择程序
它的逻辑是将你输入的值与条件逐一进行比对然后再执行,我们有另外一种更加高效的方法来完成它:switch-case语句
switch():根据switch括号内的变量或者表达式结果来决定执行哪个case冒号后面的语句,直到遇到break为止。如果所有条件都不匹配,执行default的语句。比起上面的if语句来说,switch语句符合哪种情况就会直接跳转到其所在行然后执行,不会再从第一个情况开始比对。十分的干净利落。
switch (控制表达式)
{case 常量:
语句;}
但是switch语句也是有局限性的:它括号里的表达式结果或者是变量只能是整型或者字符型,因此它的case里的常量只能是常数或者常数计算表达式如1、2、3;1+1,1+2;a、b、c;定义的常量等。
break语句
并不是不同的case分割了switch语句,实际上,如果case之间没有break语句的话,程序会从第一个符合的case开始将所有case加上default都执行一遍最后退出。case只是标志了整个分支开始执行的位置。
注:如果两个情况要执行的语句相同,比如100分和90+分都是一个等级,可以写成这样:
switch(grades)
case 10:
case 9: printf("你的成绩是A!");break;