首页 > 编程笔记 > C语言笔记 阅读:283

C语言switch语句的用法(非常详细,附带实例)

在 C语言中,switch 是一种多分支的选择结构,可以根据不同的条件执行不同的语句块。

switch 语句的基本语法如下:
switch(整型表达式)
{
    case 整型常量1:
        语句1;
        break;
    case 整型常量2:
        语句2;
        break;
    ...
    default:
        语句n;
        break;
}
其中,整型表达式可以是确定值为整型的表达式,而整型常量可以是整数、字符或枚举类型。

每个 case 分支表示一种可能的情况,default 分支则表示当所有的 case 都不符合时需要执行的语句块。当执行 switch 语句时,会将表达式的值和每个 case 分支的常量值进行比较。如果匹配成功,则执行该 case 分支的语句块;如果匹配不成功,则执行 default 分支的语句块(如果有的话)。

每个 case 分支的语句块结束后,需要使用 break 语句来终止整个 switch 语句的执行,否则会继续执行下一个 case 分支的语句块。

switch 语句的执行步骤如下:
switch 的使用如下图所示:


图 1 switch示例

switch 语句的几个注意事项:

switch中break的功能

在下面的实例中,每个 case 后面的 break 都被删除了。
#include <stdio.h>
int main()
{
    char c;
    scanf("%c", &c);
    switch(c)
    {
        case 'a':
            printf("alpha\n");
        case 'b':
            printf("bravo\n");
        case 'c':
            printf("charlie\n");
        case 'd':
            printf("delta\n");
        case 'e':
            printf("echo\n");
        case 'f':
            printf("foxtrot\n");
        case 'g':
            printf("golf\n");
        default:
            printf("i don't know\n");
    }
    return 0;
}
运行该代码并在控制台中输入 'e',看看会有什么结果:

e
echo
foxtrot
golf
i don't know

我们可以看出,这个结果输出了从 e 开始其后的所有对应单词,同时执行了 default。

实际上,switch 在找到对应的 case 后,会从对应的 case 处开始执行,并会执行完之后的所有 case,除非遇到 break 才会跳出整个 switch。

为了使代码按照预期执行,需要在代码中加上 break。我们在代码的第 6 个 case 中,即 'f' 处加上 break:
#include <stdio.h>
int main()
{
    char c;
    scanf("%c", &c);
    switch(c)
    {
        case 'a':
            printf("alpha\n");
        case 'b':
            printf("bravo\n");
        case 'c':
            printf("charlie\n");
        case 'd':
            printf("delta\n");
        case 'e':
            printf("echo\n");
        case 'f':
            printf("foxtrot\n");
            break;
        case 'g':
            printf("golf\n");
        default:
            printf("i don't know\n");
    }
    return 0;
}
运行结果为:

e
echo
foxtrot

在加上了 break 后,程序在执行到 'f' 时跳出 switch。如果你不想执行后续的 case,一定要加上 break,以便跳出整个 switch。

break和continue在switch语句的作用范围

我们知道,break 和 continue 都是可以作用于循环结构的,那么若把循环和 switch 相结合,它们究竟作用于谁呢?

1) break的作用范围

在 C语言中,break 关键字可以用于循环语句和 switch 语句中。但是,如果循环语句和 switch 语句同时存在,那么 break 关键字的作用范围是什么呢?

让我们以下面的程序为例,考虑 switch 中的 break 能否让 while(1) 循环结束:
#include <stdio.h>
int main()
{
    char c;
    while(1)
    {
        scanf("%c", &c);
        switch(c)
        {
            case 'a':
                printf("alpha\n");
                break;
            case 'b':
                printf("bravo\n");
                break;
            case 'c':
                printf("charlie\n");
                break;
            default:
                printf("i don't know\n");
        }
        getchar();    // 吸收字符'\n'
    }
    return 0;
}
答案是不能。switch 中的 break 只能作用于 switch 语句内部,它的作用是跳出 switch 语句,而不能对 while 语句产生影响。

如果我们将 break 写在 switch 语句外部,那么它将对 while 语句产生影响。我们可以查看下面的实例:
#include <stdio.h>
int main()
{
    char c;
    while(1)
    {
        scanf("%c", &c);
        switch(c)
        {
            case 'a':
                printf("alpha\n");
                break;    // 这个break 直属于 switch
            case 'b':
                printf("bravo\n");
                break;    // 这个break 直属于 switch
            case 'c':
                printf("charlie\n");
                break;    // 这个break 直属于 switch
            default:
                printf("i don't know\n");
        }
        getchar();  // 这个break 直属于 while
        break;
    }
    return 0;
}

2) continue的作用范围

和 break 类似,如果循环语句和 switch 语句同时存在,那么 continue 关键字的作用范围是什么呢?

分析下面的程序:
#include <stdio.h>
int main()
{
    char c;
    while(1)
    {
        scanf("%c", &c);
        switch(c)
        {
            case 'a':
                printf("alpha\n");
                break;
            case 'b':
                printf("continue\n");
                getchar();
                continue;
                printf("bravo\n");  // 这句代码不会被执行
                break;
            case 'c':
                printf("charlie\n");
                break;
            default:
                printf("i don't know\n");
        }
        getchar();
    }
    return 0;
}
输出结果为:

b
continue

continue 关键字由于对 switch 语句没有影响,因此直接作用于 while 循环语句。当输入字符 b 时,在执行完 continue 前的两条语句后,程序会跳过 continue 后面的代码,重新开始下一次的循环。因此,输出的结果只会是字符 b 对应的字符串 continue。

相关文章