首页 > 编程笔记 > C语言笔记

c语言case后面的表达式有什么要求?

在C语言中,switch-case 语句是一种常用的多分支选择结构。case 关键字后面的表达式有一些特定的要求,了解这些要求对于正确使用 switch-case 语句至关重要。

常量表达式要求

case 后面必须跟一个常量表达式,这意味着表达式的值在编译时就能确定,而不是在运行时计算得出。常量表达式可以是以下几种形式:


来看一个简单的例子:

#include <stdio.h>

int main() {
    int choice = 2;
    switch (choice) {
        case 1:
            printf("You chose option 1\n");
            break;
        case 2:
            printf("You chose option 2\n");
            break;
        case 3:
            printf("You chose option 3\n");
            break;
        default:
            printf("Invalid choice\n");
    }
    return 0;
}
输出结果:
You chose option 2

在这个例子中,每个 case 后面都跟着一个整型常量。

不允许使用变量

case 后面不能使用变量或需要运行时计算的表达式,这是因为编译器需要在编译时就能确定每个 case 的值,以便生成高效的跳转表。以下是一个错误的例子:

int x = 5;
int y = 10;
switch (someValue) {
    case x:  // 错误:不能使用变量
        // ...
        break;
    case x + y:  // 错误:不能使用需要运行时计算的表达式
        // ...
        break;
}

类型匹配要求

case 表达式的类型必须与 switch 表达式的类型兼容。通常,它们应该是相同的类型,或者可以进行隐式类型转换。例如,如果 switch 表达式是 int 类型,case 表达式也应该是能够转换为 int 的类型。

#include <stdio.h>

int main() {
    char grade = 'B';
    switch (grade) {
        case 'A':
            printf("Excellent!\n");
            break;
        case 'B':
            printf("Good job!\n");
            break;
        case 'C':
            printf("Average performance.\n");
            break;
        case 'D':
            printf("Need improvement.\n");
            break;
        case 'F':
            printf("Failed.\n");
            break;
        default:
            printf("Invalid grade.\n");
    }
    return 0;
}
输出结果:
Good job!

在这个例子中,switch 表达式和 case 表达式都是 char 类型。

唯一性要求

在同一个 switch 语句中,每个 case 的值必须是唯一的,不允许出现重复的 case 值。如果出现重复,编译器会报错。例如:

switch (x) {
    case 1:
        // ...
        break;
    case 2:
        // ...
        break;
    case 1:  // 错误:重复的 case 值
        // ...
        break;
}

使用枚举常量

枚举常量是 case 表达式的一个很好选择,特别是当你处理一组相关的常量时,使用枚举可以提高代码的可读性和可维护性。例如:

#include <stdio.h>

enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };

int main() {
    enum Days today = WEDNESDAY;
    switch (today) {
        case SUNDAY:
            printf("It's Sunday, time to relax!\n");
            break;
        case MONDAY:
            printf("Back to work.\n");
            break;
        case TUESDAY:
        case WEDNESDAY:
        case THURSDAY:
            printf("Midweek grind.\n");
            break;
        case FRIDAY:
            printf("TGIF!\n");
            break;
        case SATURDAY:
            printf("Weekend fun!\n");
            break;
    }
    return 0;
}
输出结果:
Midweek grind.

使用 const 常量

虽然普通变量不能用在 case 表达式中,但是用 const 修饰的常量是可以的,这是因为 const 常量的值在编译时就已确定。例如:

#include <stdio.h>

int main() {
    const int LOW = 0;
    const int MEDIUM = 1;
    const int HIGH = 2;

    int priority = 1;

    switch (priority) {
        case LOW:
            printf("Low priority task.\n");
            break;
        case MEDIUM:
            printf("Medium priority task.\n");
            break;
        case HIGH:
            printf("High priority task.\n");
            break;
        default:
            printf("Unknown priority level.\n");
    }

    return 0;
}
输出结果:
Medium priority task.

注意事项

虽然 case 表达式必须是常量,但这并不意味着它们只能是简单的数字或字符,你完全可以使用常量表达式,只要它们在编译时能够被求值。例如:

#include <stdio.h>

#define BASE 100
#define OFFSET 5

int main() {
    int code = 102;

    switch (code) {
        case BASE:
            printf("Base case.\n");
            break;
        case BASE + 1:
            printf("Base + 1 case.\n");
            break;
        case BASE + OFFSET:
            printf("Base + Offset case.\n");
            break;
        default:
            printf("Unknown code.\n");
    }

    return 0;
}
输出结果:
Base + 2 case.

在这个例子中,我们使用了宏定义的常量和常量表达式作为 case 的值,这些表达式在编译时会被计算出具体的值。


理解并遵守这些关于 case 表达式的要求,可以帮助你更好地使用 switch-case 语句,编写出更清晰、更高效的代码。记住,switch-case 语句的主要优势在于它可以提供比一系列 if-else 语句更高的执行效率,特别是在处理多个分支的情况下。

推荐阅读