C语言选择结构

前面的代码都是按照顺序结构进行设计。在开发系统的时候有时候需要实现:当年龄大于 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\n");
    }
    printf("执行结束\n");
    getchar();
    return 0;
}

当 if 语句后面指定的语句只有一行时,花括号{ }可以省略不写,例如:

#include<stdio.h>
int main()
{
    int age=8;
    if(age>18)
    	printf("年龄大于 18\n");
    printf("执行结束\n");
    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("成年人\n");
    }
    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("年龄不正确\n");
    }
    else if(age<6)
    {
    	printf("%s\n","小婴儿");
    }
    else if(age<18)
    {
    	printf("%s\n","小鲜肉");
    }
    else if(age<50)
    {
    	printf("%s\n","大叔");
    }
    else
    {
    	printf("%s\n","老爷爷");
    }
    getchar();
    return 0;
}

else 也可以省略,那么就是如果上面的每个 if 都不匹配,就什么都不做。

(二) if 语句常见错误

1. 常见错误 1

//if 语句后面多加了分号,出错代码:
#include<stdio.h>
int main()
{
    int age=10;
    if(age>18); //错误写法
    {
    	printf("年龄大于 18\n");
    }
    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\n");
    }
    else
    {
    	printf("a 不等于 0\n");
    }
    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;
}

【说明】

  1. switch 小括号中表达式的运算结果必须是整数类型(包括字符类型),比如:long、int、short、char 等等。不能是 float 等其他类型。
  2. case 后面的字面量表达式运算结果也必须是整数类型。
  3. switch 下面的花括号内是一个语句块。语句块中包含多个以 case 开头、break 结尾的行、最多一个以 default 开头的行出现在语句块的结束部分,并且只能出现一次。
  4. 当表达式的值与 case 后面的值相等时,就执行该 case 后面的语句,接着执行下一行的break,然后退出整个switch语句,switch中其他语句都不再执行,这一点和if…else if…else语句有点类似。
  5. 如果表达式的值与所有 case 后面的值都不匹配时,则执行 default 后面的语句,然后退出 switch。
  6. switch 中的“case 字面量”只是一个标记,一旦 switch 表达式的值与其中一个 case后面字面量匹配时,就会从该 case 行一直执行下去,直到遇到 break 才停止,然后退出 switch语句块。因此写 case 的时候结尾不要忘了写 break。

switch 中只要有一个 break 语句被执行,就会直接结束整个 switch 语句块。

posted @ 2021-03-10 00:06  与鹿逐秋  阅读(1009)  评论(0编辑  收藏  举报