嵌套的IF-ELSE
判断三个数字的大小
#include <stdio.h> int main() { int a = 0,b = 0,c = 0; scanf("%d,%d,%d",&a,&b,&c); int max; if (a > b){ if (a > c){ max = a; }else{ max = b; } }else{ if (b > c){ max = b; }else{ max = c; } } printf("max=%d",max); }
1512,4751,995 max=4751 -------------------------------- Process exited after 10.74 seconds with return value 8
提示
if、else后面的大括号中只有一句话时可以省略大括号
省略括号后的程序如下:
#include <stdio.h> int main() { int a = 0,b = 0,c = 0; scanf("%d,%d,%d",&a,&b,&c); int max; if (a > b) if (a > c) max = a; else max = b; else if (b > c) max = b; else max = c; printf("max=%d",max); }
嵌套的判断
当if的条件满足或者不满足时,要执行的语句也可以是if或if-else语句,称为嵌套的if语句。
else的匹配
else总是和最近的那个if匹配。
#include <stdio.h> int main() { const int count = 20; int a = 0,b = 0; scanf("%d,%d",&a,&b); if (a == b) if (a < count) printf("good"); else printf("bad"); return 0; }
(1)当a和b相等并大于count时,程序跳到12:
26,26 bad -------------------------------- Process exited after 5.431 seconds with return value 0
(2)当a和b相等并小于count时,程序执行10:
16,16 good -------------------------------- Process exited after 6.571 seconds with return value 0
(3)当a和b不相等时,程序跳到13:
16,26 -------------------------------- Process exited after 3.551 seconds with return value 0
使用大括号可以改变if和else的配对关系
#include <stdio.h> int main() { const int count = 20; int a = 0,b = 0; scanf("%d,%d",&a,&b); if (a == b){ if (a < count) printf("good"); }else printf("bad"); return 0; }
(1)当a和b相等并大于count时,程序跳到13:
26,26 -------------------------------- Process exited after 3.419 seconds with return value 0
(2)当a和b相等并小于count时,程序执行10:
15,15 good -------------------------------- Process exited after 2.986 seconds with return value 0
(3)当a和b不相等时,程序跳到12:
15,26 bad -------------------------------- Process exited after 4.109 seconds with return value 0
对于上述加了括号的if-else程序来说,括号内的的if语句没有对应的else语句,else语句和大括号前的if语句组合。
缩进
缩进格式不能暗示else的匹配
#include <stdio.h> int main() { const int count = 20; int a = 0,b = 0; scanf("%d,%d",&a,&b); if (a == b) if (a < count) printf("good"); else printf("bad"); return 0; }
(1)当a和b相等并大于count时,程序执行12:
26,26 bad -------------------------------- Process exited after 2.298 seconds with return value 0
(2)当a和b不相等时,程序跳到13:
26,16 -------------------------------- Process exited after 3.258 seconds with return value 0
提示
上述实验证明格式的缩进不会影响else和if的匹配,else还是会首先和最近的if匹配,如果需要改变匹配关系,需要使用大括号。
注意
为了避免不必要的麻烦和误解,在if和else后加上大括号,作为良好的编程习惯。
级联的IF-ELSE IF
分段函数的if-else写法
表示f(x)={-1,x<0;0,x=0;2x,x>0}
#include <stdio.h> int main() { int x = 0,f = 0; scanf("%d",&x); if (x < 0){ f = -1; }else{ if(x == 0){ f = 0; }else{ f = 2 * x; } } printf("%d",f); return 0; }
提示
else后接if,可以连写在一起“else if”
将上述程序的9、10行的else、if语句改写:
#include <stdio.h> int main() { int x = 0,f = 0; scanf("%d",&x); if (x < 0){ f = -1; }else if(x == 0){ f = 0; }else{ f = 2 * x; } printf("%d",f); return 0; }
上述流程图,构成了如下级联的if-else:
if(exp1) st1; else if(exp2) st2; else st3;
程序的最前面和最后面有一个匹配的if和else,中间部分写成else if,在程序中,所有的else都对齐,在条件很多时可以节省屏幕空间,便于阅读。
上述改写过的程序还有一种表达方式,省略变量f,在每一个条件后输出结果,如下:
左边的程序优势更明显(单一出口),变量f的使用和程序执行过程无关,后续变量f可以用于其他运算,右边的程序每一步判断后直接输出结果,后续无法参与其他计算。