开发者学堂课程【你的第一门C语言课: Switch 语句和分支嵌套】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5462
Switch 语句和分支嵌套|学习笔记
内容介绍:
一、 Switch 语句
二、 分支结构的嵌套
一、switch 语句
…//其他语句
Switch(表达式)
{
Case 常量表达式1:语句程序块1;
Case 常量表达式2:语句程序块2 ;
……
Case 常量表达式n:语句程序快n;
Default:语句程序块n+1;
}
……//其他语句
先计算小括号里表达式的值,case 后面的常量表达式或语句或程序块,表达式得到的值是某一个常量就会跳到对应的 case 上执行,如果上述所有 case 语句都没有符合的,那么就会执行 default 后面的语句或程序块。
defauIt 是可写的,如果没有 defauIt,并且上面没有符合的,那么 switch 语句就不会做任何动作。
程序代码编写:
通过平级反馈出来分数范围的程序,
#include
int main( )
{
char ch;
printf(""请输入成绩:");
scanf("%c", &ch) ;
switch (ch)
{
case "A':printf(你的成绩在90分以上! \n") ;
case 'B':printf(""你的成绩在80~90分之间l in");
case 'c' : printf(""你的成绩在70~80分之间l \n"");
case 'D' :printf("你的成绩在60~ 70分之间l \n");
case 'E' :printf("你的成绩在60分以下! \n"");
default: printf(“请输入有效的成绩评级!\n");
}
return 0;
}
程序代码执行如下:
[ fishc@localhost sle12]$ gcc test1.c && ./a.out
请输入成绩:A
你的成绩在
90分以上
!
你的成绩在80~90分之间!
你的成绩在
70
~
80分之间!
你的成绩在
60~70分之间!
你的成绩在60分以下l
请输入有效的成绩评级!
[ fishc@localhost s1e12]$
会发现下方所有的 case 都输出了,问题是C 语言并没有想象的那么智能,case、defauIt 都是标签而已。
所谓标签就是标志一个位置, switch 语句就负责跳转到这些标签指定的位置上,仅此而已,然后依次往下执行。
所以需要配合 break 语句:
…//其他语句
Switch(表达式)
{
Case常量表达式1:语句程序块1;break;
Case常量表达式2:语句程序块2 ;break;
……
Case 常量表达式n:语句程序快n;break;
Default:语句程序块n+1;break;
}
……//其他语句
当代码执行到 break 时,就会跳出整个 switch 语句,也就避开了其他的 case 和 defauIt,只需在每一个后面追加一个 break:
#include
int main( )
{
char ch;
printf(""请输入成绩:");
scanf("%c", &ch) ;
switch (ch)
{
case "A':printf(你的成绩在90分以上! \n") ;
break;
case 'B':printf(""你的成绩在80~90分之间l in");
break;
case 'c' : printf(""你的成绩在70~80分之间l \n"");
break;
case 'D' :printf("你的成绩在60~ 70分之间l \n");
break;
case 'E' :printf("你的成绩在60分以下! \n"");
break;
default: printf(“请输入有效的成绩评级!\n");
break;
}
return 0;
}
DefauIt 后面不用加,因为是最后一个语句了,但为了良好的习惯还是加上。
执行:
请输入成绩
:A
你的成绩在
90分以上!
[fishc@localhost sle12]$../a.out
这时其他的就不会被执行。
二、分支结构的嵌套
在一个 if 语句中包含另一个 if 语句,称为 if 语句的嵌套,也称为分支结构的嵌套。
if(表达式)
if(表达式)
…… 内嵌if
else
……
else
if(表达式)
……内嵌if
else
……
首先进来把要求输入两个整数到变量a和b中,首先判断 a!=b,如果判断结果为 Y 的话,就判断 a>b,如果判断为 Y的话就输出 a>b,如果为 N 就输出 a
代码编写实例:
#inc
l
ude
int main ( )
{
int a, b; //
声明两个变量
printf("请输入两个数; ");
scanf("%sd %d", &a, &b) ; //
有些人这里会写上a
=
,不需要写,因为这里
printf
双引号里写入内容会打印出来,而写入
a
=
只是占位标志符,如果写上了后在输入的时候只能写上a
=
后在输入。
if(a!=b)
{
if(a>b)
{
printf("%d > %d\n", a, b) ;
}
else
{
printf("%d < %d\n", a, b) ;
}
}
e
lse
{
printf(
”%d = %d\n”,a,b
);
}
return 0;
}
程序执行结果如下:
[ fishc@localhost s1e12]$ vi test2.c
[ fishc@localhost sle12]$ gcc test2.c && ./a.out
请输入两个数:23 32
23 <32
[fishc@localhost sle12]$ ./a.out
请输入两个数:32 32
32=32
[ fishc@localhost s1e12]$ ./a.out
请输入两个数:32 23
32 >23
悬挂else
比如你看上了隔壁班的小花,那么你就计划着约人家周末去看电影,接下来就有两个问题:
1.小花有没有空
2.那天下不下雨
显然第一个问题是主要的,
代码编写实例:
include
int main( )
{
char isRain,isFree;
printf("是否有空? (Y/N)");
scanf ("%c",&isFree) ;
printf(""是否下雨?(Y /N)");
scanf("%c",&isRain) ;
if ( isFree.."Y)
{
if(isRain-="Y')
printf(记得带伞噢^_^\n"");
}
else
{
printf (""女神没空
!
T_T\n"");
}
return 0:
}
代码执行结果如下:
[fishc@localhost sle12]$ gcc bug1.c && ./a.out
是否有空? (Y/N)
输入Y会出现:
是否下雨? (Y/N)女神没空 !T_T
因为输入 y,然后回车,回车实际上也是作为一个字符去输入,所以第一个 %c 接收到的是 y,第二个接收到的是回车,所以需要把回车过滤掉写入:
g
etchar();
这时执行还是有问题,因为代码中如果不是 Free 的话,执行 else,实际上 C 语言有一个原则:else 始终与最接近它的 if 匹配。
解决的方法是在 if 下加入 { } ,说明{ }里的语句块当成一条语句执行,所以 else 就不会再去匹配 if 了。
如果屏幕太小,那么可以把左边的大括号移到上一行,右边保持一样。
执行,没有任何问题。
等于号带来的问题
判断小花是否有男朋友
代码编写实例:
#include estdio.h>
int main( )
{
char hasBF;
printf(""小花你有男朋友吗?(Y/N)"");
scanf ( ""%c"", &hasBF);
if (’Y’= hasBF )
//这里不能用=,表示赋值,非0为真的,所以会执行下方内容,所以需要 == 或者将两个数值对调一下。
{
printf(""那 ……祝福你们咯l \n");
}
else
{
printf(""那我们在一起吧l \n");
}
return 0;
}
执行会出错,因为:
if (hasBF=’Y’) //这里不能用=,表示赋值,非0为真的,所以会执行下方内容,所以需要 == 或者将两个数值对调一下:
if (’Y’=hasBF)
这样就相当于把 hasBF 赋值给 常量 y,编译器无论如何也不允许给一个常量赋值。