前面的代码都是按照顺序结构进行设计。在开发系统的时候有时候需要实现:当年龄大于 18 岁的时候,执行 A,否则执行 B。就要用选择结构。
C 语言为实现选择结构提供了 2 种语句:
(1) if 选择语句。
(2) switch 选择语句。
(一) if 语句
if 语句是通过判断给定的条件是否为真,来决定是否执行指定的代码,if 语句常用的形式有 3 种。
1. if 语句的第一种形式
if(表达式) 语句
或
if(表达式)
{
语句块
}
(1) 表达式一般是比较表达式、或逻辑表达式。
(2) 语句可以是单行语句,也可以是复合语句(语句块)。
如果表达式运算结果为真(非 0 为真),则执行 if 后面的语句,如果为假(0 为假)直接跳过
该语句(语句块)。
//if 语句应用
#include<stdio.h>
int main()
{
int age=8;
if(age>18)
{
printf("年龄大于 18
");
}
printf("执行结束
");
getchar();
return 0;
}
当 if 语句后面指定的语句只有一行时,花括号{ }可以省略不写,例如:
#include<stdio.h>
int main()
{
int age=8;
if(age>18)
printf("年龄大于 18
");
printf("执行结束
");
getchar();
return 0;
}
不过为了使程序更加清晰、避免出错,建议读者无论 if 语句后面指定的语句有多少行,都加上花括号{ }。
2. if 语句的第二种形式
if(表达式)
{
语句 1
}//这里不要写分号,因为不是一个独立的代码结构
else
{
语句 2
}
该语句的执行过程为:如果表达式结果为真(非 0),执行 if 后面{ }中的语句 1。如果为假(0),则执行 else 后面{ }中的语句 2。也就是说 if 与 else 后面的语句只能有一个被执行。
#include<stdio.h>
int main()
{
int age=10;
if(age>18)
{
printf("成年人
");
}
else
{
printf("未成年人");
}
getchar();
return 0;
}
3. if 语句的第三种形式
if(表达式 1)
{
语句 1;
}
else if(表达式 2)
{
语句 2;
}
……
else if(表达式 m)
{
语句 m;
}
else
{
语句 n;
}
这种形式的 if 语句也被称为 if…else if…esle 语句,该语句的执行过程为:依次判断表达式的值,当其中一个表达式结果为真(非 0),执行其后面对应的语句,然后直接跳出整个 if语句。如果所有的表达式都是假,则执行 else 后面的语句,然后跳出整个 if 语句。
#include<stdio.h>
int main(void)
{
int age=16;
if(age<0)
{
printf("年龄不正确
");
}
else if(age<6)
{
printf("%s
","小婴儿");
}
else if(age<18)
{
printf("%s
","小鲜肉");
}
else if(age<50)
{
printf("%s
","大叔");
}
else
{
printf("%s
","老爷爷");
}
getchar();
return 0;
}
else 也可以省略,那么就是如果上面的每个 if 都不匹配,就什么都不做。
(二) if 语句常见错误
1. 常见错误 1
//if 语句后面多加了分号,出错代码:
#include<stdio.h>
int main()
{
int age=10;
if(age>18); //错误写法
{
printf("年龄大于 18
");
}
printf("执行结束");
getchar();
return 0;
}
第 5 行 if 后面多加了分号。前面讲过 C 语言中单独的分号也是一条语句,叫做空语句。因此,系统会将左侧第 5 行当做一个完整的 if 语句看待,当条件为真时执行后面的空语句。而第 6-8 行,则当做普通的语句块,所以无论 if 条件是真、是假,该语句块都会被执行。
2. 常见错误 2
在 if 语句中,将比较运算(==)错误写成了赋值运算符(=),例如:
#include<stdio.h>
int main()
{
int a=0;
if(a=0) //出错代码
{
printf("a 等于 0
");
}
else
{
printf("a 不等于 0
");
}
getchar();
return 0;
}
这样 a=0 就是赋值表达式,值就是赋值之后的值 0,也就是 if(a=0)永远是“假”。
为了避免失误写错,有人习惯这样写相等判断:
if(0==a)
这样万一写错成了 if(0=a)那么就会有编译错误导致编译失败,就能提前发现问题了。
(三) if 语句嵌套
if 语句嵌套指的是在 if 语句中再嵌套使用 if 语句。以第一种形式 if 语句为例:
if(表达式 1)
{
if(表达式 2) //if 语句嵌套
{
语句;
}
}
下面通过例子来理解 if 语句嵌套使用。
#include<stdio.h>
int main()
{
int age=35;
if(age>18) //外层 if 语句
{
printf("age 大于 18");
if(age>30) //内层 if 语句
{
printf("age 大于 30");
}
}
getchar();
return 0;
}
看起来很复杂,其实只要知道“每一级嵌套都是一个小世界”,在看外层嵌套的时候,把内层的嵌套看成一个语句就行了,分析内部嵌套的时候再忽略外部的嵌套。
(五) switch 语句
C 语言提供了另外一种多分支处理语句:switch 语句。
1. switch 语句形式
switch 语句的一般形式:
switch(表达式)
{
case 字面量表达式 1: 语句 1;
break;
case 字面量表达式 2: 语句 2;
break;
……
case 字面量表达式 n: 语句 n;
break;
default: 语句 n+1;
}
【说明】
- switch 小括号中表达式的运算结果必须是整数类型(包括字符类型),比如:long、int、short、char 等等。不能是 float 等其他类型。
- case 后面的字面量表达式运算结果也必须是整数类型。
- switch 下面的花括号内是一个语句块。语句块中包含多个以 case 开头、break 结尾的行、最多一个以 default 开头的行出现在语句块的结束部分,并且只能出现一次。
- 当表达式的值与 case 后面的值相等时,就执行该 case 后面的语句,接着执行下一行的break,然后退出整个switch语句,switch中其他语句都不再执行,这一点和if…else if…else语句有点类似。
- 如果表达式的值与所有 case 后面的值都不匹配时,则执行 default 后面的语句,然后退出 switch。
- switch 中的“case 字面量”只是一个标记,一旦 switch 表达式的值与其中一个 case后面字面量匹配时,就会从该 case 行一直执行下去,直到遇到 break 才停止,然后退出 switch语句块。因此写 case 的时候结尾不要忘了写 break。
switch 中只要有一个 break 语句被执行,就会直接结束整个 switch 语句块。