跳转至

C语言中的分支语句

约 786 个字 262 行代码 预计阅读时间 6 分钟

if语句

基本结构

C
1
2
3
4
if(表达式)
{
    //语句
}

基本语法

当表达式为真(非0,包括小于0)时,执行if中的语句,当表达式为假(0)时,不执行if中的语句

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main()
{
    int num = 1;
    int num1 = 2;

    if(num > num1)
    {
        printf("The bigger number is: %d.", num);//由于num<num1,if表达式为假,此时不执行if内的语句
    }

    return 0;
}

上面的代码因为表达式num > num1的值为0,故不执行if中的printf()语句。

在上面的代码中如果为假,不执行if语句,代码执行完成后无任何打印,为了使逻辑更完整,引入else语句

else语句

作用:对if语句的补充

例如:(继上面的代码进行补充)

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main()
{
    int num = 1;
    int num1 = 2;

    //由于num<num1,if表达式为假,此时不执行if内的语句,但执行else中的语句,而else对应的条件为num <= num1
    if(num > num1)
    {
        printf("The bigger number is: %d.", num);
    }
    else
    {
        printf("The bigger number is: %d.", num1);
    }

    return 0;
}
输出结果
The bigger number is: 2.

在改进的代码中,增加了else语句对if语句进行补充,使代码整体逻辑更加完整。代码中num>num1表达式为假不执行if语句,开始执行else语句中的逻辑(num <= num1),表达式为真,执行else中的printf()语句。

语句包括量

if语句和else语句中,若if()后面无大括号,则if或者else只能包含紧随其后的一条语句

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
    int num = 1;
    int num1 = 2;

    if(num > num1)
        printf("The bigger number is: %d.", num);
    printf("不论是否满足num > num1,都要执行此打印语句\n");

    return 0;
}
输出结果
不论是否满足num > num1都要执行此打印语句

在此代码中,if()后并无{}括号,则此时只能if()只能包括紧随其后的printf("The bigger number is: %d.", num);而不能包括printf("不论是否满足num > num1,都要执行此打印语句");

if语句的嵌套

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if(num == 0)
    {
        printf("输入的数字是0\n");
    }
    else 
    {
        if(num > 0)
        {
            printf("输入的是正数\n");
        }
        else
        {
            printf("输入的是负数\n");
        }
    }

    return 0;
}
输入
1
输出结果
请输入一个整数1
输入的是正数

在上面的代码中,if语句只包含了一条语句,而else语句中包含了新的if…else…语句构成嵌套。上面的代码还可以简化为:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if(num == 0)
    {
        printf("输入的数字是0\n");
    }
    else if(num > 0)
    {
         printf("输入的是正数\n");
    }
    else
    {
        printf("输入的是负数\n");
    }


    return 0;
}

注意,else都是与其最近的if相匹配,而不是根据缩进来看

Note

空格以及缩进只是为了代码格式化,但是编译器编译时都会忽略所有空格和缩进

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if(num == 0)
        if(num > 0)
        {
            printf("输入的是正数\n");
        }
    else
        {
            printf("输入的是负数\n");//当输入非0值并不执行本语句,因为else紧跟着最近的if
        }

    return 0;
}

在上面的代码中,elseif(num > 0)匹配而不是与if(num == 0)匹配(尽管在格式上与第一个if同一级)

switch语句

基本结构

C
1
2
3
4
5
6
switch(整型表达式)
{
    case 整型常量1//语句
    case 整型常量2//语句
    default://语句
}

基本语法

根据整形表达式不同的值,执行相应的case分支,若找不到对应的值(整型常量),就执行default语句

Note

default语句可以省略,无匹配时就不执行任何操作

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main()
{
    int num = 0;

    scanf("%d", &num);

    switch(num)
    {
    case 0:
        printf("输入的是0");
        break;
    case 1:
        printf("输入的是1");
        break;
    case 2:
        printf("输入的是2");
        break;
    default:
        printf("输入的是其他数");
    }

    return 0;
}
输入
1
输出结果
输入的是1

在上面的代码中,若输入值为0,进入switch语句中,找到并执行0对应的case语句,以此类推1和2,但是若输入0、1和2以外的数值,则打印“输入的是其他数”

注意:

  1. switch后面的表达式必须是整型表达式(包括字符类型以及计算结果为整型的运算式)
  2. case后的值,必须是整型常量表达式(不可以是变量,但是可以是字符,例如case 'a': //语句)
  3. switch中声明局部变量要在每个case下加一个大括号
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    int num = 0;

    scanf("%d", &num);

    switch (num)
    {
    case 0:
        //不能缺少花括号
    {
        //可以直接将case中的内容放在花括号内
        //char a = 'b';
        //printf("输入的是0\n");
        //printf("%c\n", a);
    }
        //也可以只给空语句块,在空语句块后声明局部变量
        char a = 'b';
        printf("输入的是0\n");
        printf("%c\n", a);
        break;
    }

    return 0;
}
输入
0
输出结果
输入的是0
b

switch中的break

作用:跳出每一个case语句(default后面可以不用break语句)

例如:(无case语句情况下)

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

int main()
{
    int num = 0;

    scanf("%d", &num);

    switch(num)
    {
    case 0:
        printf("输入的是0");
    case 1:
        printf("输入的是1");
    case 2:
        printf("输入的是2");
    default:
        printf("输入的是其他数");
    }

    return 0;
}
输入
0
输出结果
输入的是0
输入的是1
输入的是2
输入的是其他数

输入
1
输出结果
输入的是1
输入的是2
输入的是其他数

在上面的代码中,case后均无break语句

输入0不但打印了case 0语句,而且打印了case 1case 2语句和default语句才结束运行。输入1则执行匹配开始的语句,即case 1case 2语句和default语句才结束运行,但是不会执行case 0语句

保留一个case语句中的break的情况下

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main()
{
    int num = 0;

    scanf("%d", &num);

    switch(num)
    {
    case 0:
        printf("输入的是0");
    case 1:
        printf("输入的是1");
        break;
    case 2:
        printf("输入的是2");
    default:
        printf("输入的是其他数");
    }

    return 0;
}
输入
0
输出结果
输入的是0
输入的是1

此时,输入0的情况下,会打印case 0case 1语句中的内容,遇到case 1 语句的break语句跳出switch语句。

Note

switch语句中的case语句和default语句顺序无任何要求