嵌套的if
找三个数中的最⼤
int a,b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int max = 0;
if ( a > b ) {
max = a;
} else {
max = b;
}
printf("大的那个是%dn", max);
• 如果要求输入三个整数,输出其中最大的,应该怎么做?
int a,b,c;
scanf("%d %d", &a, &b);
int max = 0;
if ( a > b ) {
if ( a > c ) {
max = a;
} else {
max = c;
}
}else {
if ( b > c) {
max = b;
}else {
max = c;
}
}
printf("The max is %dn", max);
嵌套的判断
• 当if的条件满⾜足或者不满⾜足的时候要执⾏行的语句也可以是⼀一条if或if-else语句,这就是嵌套的if语句
if ( code == READY )
if ( count <20 )
printf(“⼀一切正常n");
else
printf(“继续等待n");
else的匹配
• else总是和最近的那个if匹配
if ( code == READY ) {
if ( count <20 )
printf("⼀一切正常n");
} else
printf("继续等待n");
缩进
• 缩进格式不能暗示else的匹配
if ( code == READY )
if ( count <20 )
printf(“⼀切正常n");
else
printf(“继续等待n");
嵌套的if
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turnn");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turnn");
else
printf("My turnn");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turnn");
else
printf("My turnn");
else
printf("GAME OVERn");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turnn");
else
printf("GAME OVERn");
if ( gameover == 0 ) {
if ( player2move == 2 )
printf("Your turnn");
} else
printf("GAME OVERn");
tips
• 在if或else后面总是用{}
• 即使只有⼀一条语句的时候
分段函数
if ( x < 0 ) {
f = -1;
} else if ( x == 0 ) {
f = 0;
} else {
f = 2 * x;
}
级联的if-else if
if ( exp1 ) st1; else if ( exp2 ) st2; else st3;if语句常见错误
• 忘了大括号
• if后面的分号
• 错误使用==和=
• 使人困惑的else
忘了大括号
• 永远在if和else后⾯面加上大括号,即使当时后面只有一条语句
if后面的分号
if ( age > 60 );
{
salary = salary * 1.2;
printf("%f",salay);
}
错误使用==和=
if只要求()里的值是零或非零
代码风格
• 在if和else之后必须加上大括号形成语句块;
• 大括号内的语句缩进一个tab的位置;
多路分⽀
switch-case
if ( type==1 )
printf("你好");
else if ( type==2)
printf("早上好");
else if ( type==3 )
printf("晚上好");
else if ( type==4 )
printf("再⻅见");
else
printf("啊,什么啊?");
switch ( type ) {
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break; default:
printf("啊,什么啊?");
}
• 控制表达式只能是整数型的结果
• 常量可以是常数,也可以是常数计算的表达式
• 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止
• 如果所有的case都不匹配,那么就执行default后⾯面的语句;如果没有default,那么就什么都不做
break
switch ( type )
{
case 1:
case 2:
printf("你好n");
break;
case 3:
printf("晚上好n");
case 4:
printf("再见n");
break;
default:
printf("啊,什么啊?n");
break;
}
• switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后⾯面没有break,就会顺序执行到下面的case里去,直到遇到⼀一个break,或者switch结束为止。
// max3.c #includeint main() { int a,b,c; scanf("%d %d %d", &a, &b, &c); int max = 0; if ( a>b ) { if ( a>c ) { max = a; } else { max = c; } } else { if ( b>c ) { max = b; } else { max = c; } } printf("The max is %dn", max); return 0; }
#includeint main() { int x; scanf("%d", &x); int f=0; if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } else if ( x >5 ) { f = 2 * x; } else { f = 3*x; } printf("%dn", f); return 0; }
#includeint main() { printf("输入成绩(0-100)"); int grade; scanf("%d", &grade); grade /=10; switch ( grade ) { case 10: case 9: printf("An"); break; case 8: printf("Bn"); break; case 7: printf("Cn"); break; case 6: printf("Dn"); break; default: printf("Fn"); break; } return 0; }
#includeint main() { printf("请输入月份:"); int month; scanf("%d", &month); switch ( month ) { case 1: printf("Januaryn"); break; case 2: printf("Februaryn"); break; case 3: printf("Marchn"); break; case 4: printf("Apriln"); break; case 5: printf("Mayn"); break; case 6: printf("Junen"); break; case 7: printf("Julyn"); break; case 8: printf("Augustn"); break; case 9: printf("Septembern"); break; case 10:printf("Octobern"); break; case 11:printf("Novembern"); break; case 12:printf("Decembern"); break; } return 0; }
课后思考题:
1、分段函数可以用switch-case吗?划算吗?答:分段函数可以用switch-case,但不划算,因为switch需要整数型表达式,且case需要常数。分析如下:
1.x取值全部为特定值,很划算,但很少见;
swtich(x){
case 0:
case 1:
}
2.x取值一般是>0.=0,<0三种情况,可以压缩成两种的情况,如视频中函数
switch(x<0){
case 0: //x=0,f=0; x>0,f=2*x; 可以合并为 x>=0, f=2*x;
case 1: // 这样就转化为判断其中任意一个条件是否成立的结果0、1
}
3.3个条件的情况可以使用3目运算符,实现也不算麻烦:
int flag= x<0 ? -1 : (x>0) //x<0,flag=-1;x>0,flag=1;x=0,flag=0;
switch(flag){
case -1:
case 0:
case 1:
}
4.x分段更多的情况就很麻烦,不划算:
if (x<0) flag=0; //搭配if-else使用,有点多此一举了:
if...
switch(flag){...}
inf flag = x<0 ? -1 : (x==0 ? 0 : (...) ) //多重嵌套三目表达式,麻烦
switch(flag){...}
2、switch-case是如何实现的?
1、case小于三,直接判断,索引表的方式进行直接跳转
2、case大于等于4,且每两个case之间的间隔之和不超过6时,按跳转表进行线性结构查找。
3、最大case值和最小case值之差大于255时,应该是先进行树形结构查找划分,直到小于等于3个数据的时候不再进行划分,然后进行索引表处理(?)。
4、switch变量大于(小于)最大(最小)值,直接走default分支。



