C语言中提供了if语句和switch语句来实现选择结构,if语句用于两者选一的情况,而switch语句用于多分支选一的情形。
一、if 语句
1、简单的if语句形式
格式:if(表达式)
语句;
功能:如果表达式为真,则执行后面的语句,否则不执行该语句,而执行if语句后面的语句。
下面是输出两个整数,输出其中最大数。
int a,b,max;
printf("please enter two numbers:");
scanf("%d%d",&a,&b);
max=a; //将a的值赋值给max
if(a<b)
max=b;
printf("%d",max);
注意:C语言程序的一句话靠“ ; ”结束,以下例子参考:
if(美女)
吃苹果;
吃橘子;
意思就是说:美女吃苹果,所有人吃橘子。
if(美女)
{ 吃苹果;
吃橘子;
}
意思是:美女吃苹果和橘子,其他人想要没有。
注意:(1)在if语句中,条件判断表达式必须用括号括起来;
(2)if后表达式通常是逻辑表达式或关系表达式,但也可以是其他任何表达式,如赋值表达式,甚至也可以是一个变量。只要表达式非零,表达式的值为真,否则为假。以下表达式为合法的:
if(a=2); //表达式为非0,后面的语句总是执行
if(b); //等价于if(b=!0);
(3)if不仅可以单个语句也可多个语句,但必须用{}括起来组成一个复合语句 。
if(a>b)
{
a++;
b++;
}
else
{
a=0;
b=1;
}
if和else之间如果只有一条语句,则不用{}括起来,但如果多于一条语句则必须用{}括起来。
(4)if语句中,相等是“==”,赋值是“=”。
2.if嵌套
一般形式为:
if (表达式) if (表达式) if (表达式1)
if语句; if语句; if (表达式2)
或 else 或 语句1;
if语句; else
语句2;
那么多个if和多个else重叠应该如何配对呢?
C语言规定,在省略{}时,else总是和它上面离他最近的未配对的if配对。
如果希望else与第一个if配对,则必须在else前加{},即:
if (表达式1)
{
if (表达式2)
语句1;
}
else
语句2;
二、switch 语句
1.一般格式:
switch ( 表达式 )
{
case 常量表达式C1:语句组1;
break;
case 常量表达式C2:语句组2;
break;
...
case 常量表达式Cn:语句组n;
break;
[default: 语句组;
break; ]
执行过程:当switch后面“表达式”的值与某个case后面的“常量表达式”的值相同时,就执行case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条语句。
如果没有任何一个case后面的“常量表达式”的值与“表达式”的值匹配,则执行default后面的语句(组),然后在执行switch语句的下一条语句。
注意:(1)switch后的“表达式”必须是一个整型表达式,而case后的类型与switch后的“表达式”类型一致。
float a,b=4.0;
scanf("%f",&a);
switch(a) //错了,不可为浮点型表达式
{
case 1:b=b+1; break;
case 2:b=b-1; break;
}
printf("b=%f\n",b);
(2)case后面的语句(组)可加{}也可以不加{},但一般不加{}。
(3)每个case后面 常量表达式 的值必须各不相同,否则会出现相互矛盾(即对表达式的同一值,不允许有两种或两种以上的执行方案)。
int a,b=4;
scanf("%d",&a);
switch(a)
{
case 1: b=b+1; break;
case 2: b=b*2; break;
case 1: b=b+2; break; //此处错误,case 1在前面已经使用,可改为case 3
}
printf("%d\n",b);
(4)每个case后面必须是“常量表达式”,表达式不能包含变量。
( 5)case 常量表达式 后必须加上break语句,以便结束switch语句
case 'N': printf("No\n"); break; case 'N':printf("No\n");
运行结果(假设输入N): case ‘A’:printf("All\n); break; //跳出switch语句
No 运行结果(假设输入N):
No
All
(6)多个case 子句共用一语句(组)。
int a,b=4;
scanf("%d",&a);
switch(a)
{
case 1:
case 2:
case 3: b+=2; break;
case 4:
case 5:
case 6: b-=2; break;
default: b*=2; break;
}
printf("b=%d\n");
(7)case 子句和default子句如果都带有break子句,那么他们之间顺序的变化不会影响switch语句的功能。
(8)case子句和default子句如果有的带break子句,而有的没有带break子句,那么它们之间顺序的变化可能影响输出的结果。
#include<stdio.h>
int main()
{
char ch;
ch=getch();
switch(ch)
{
case 'Y': printf("Yes\n"); break;
case 'N': printf("No\n"); break;
case 'A': printf("All\n"); break;
default: printf("Yes,No or All");
}
return 0;
}
运行结果(假设输入B):
Yes,No or All
#include<stdio.h>
int main()
{
char ch;
ch=getch();
switch(ch)
{
case 'Y': printf("Yes\n"); break;
default: printf("Yes,No or All");
case 'N': printf("No\n"); break;
case 'A': printf("All\n"); break;
}
return 0;
}
运行结果(假设输入B):
Yes,No or All
No
2.switch语句嵌套
int main()
{
int x=1,y=0,a=0,b=0;
switch(x)
{
case 1: switch(y)
{
case 0:a++; break;
case 1:b++; break;
}
case 2: a++; b++; break;
case 3: a++; b++;
}
printf("\n%d,b=%d",a,b);
return 0;
}
运行结果:
a=2,b=1