嵌套的if
找三个数中的最⼤
int a,b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int max = 0;
if ( a > b ) {
max = a;
} else {
max = b;
}
printf("大的那个是%d\n", 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 %d\n", 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 turn\n");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turn\n");
else
printf("My turn\n");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turn\n");
else
printf("My turn\n");
else
printf("GAME OVER\n");
if ( gameover == 0 )
if ( player2move == 2 )
printf("Your turn\n");
else
printf("GAME OVER\n");
if ( gameover == 0 ) {
if ( player2move == 2 )
printf("Your turn\n");
} else
printf("GAME OVER\n");
tips
• 在if或else后面总是用{}
• 即使只有⼀一条语句的时候
级联的if-else if
分段函数
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
#include <stdio.h>
int 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 %d\n", max);
return 0;
}
#include <stdio.h>
int 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("%d\n", f);
return 0;
}
#include <stdio.h>
int main()
{
printf("输入成绩(0-100)");
int grade;
scanf("%d", &grade);
grade /=10;
switch ( grade ) {
case 10:
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("F\n");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
printf("请输入月份:");
int month;
scanf("%d", &month);
switch ( month )
{
case 1: printf("January\n"); break;
case 2: printf("February\n"); break;
case 3: printf("March\n"); break;
case 4: printf("April\n"); break;
case 5: printf("May\n"); break;
case 6: printf("June\n"); break;
case 7: printf("July\n"); break;
case 8: printf("August\n"); break;
case 9: printf("September\n"); break;
case 10:printf("October\n"); break;
case 11:printf("November\n"); break;
case 12:printf("December\n"); 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分支。