c语言case后面的表达式有什么要求?
在C语言中,switch-case 语句是一种常用的多分支选择结构。case 关键字后面的表达式有一些特定的要求,了解这些要求对于正确使用 switch-case 语句至关重要。
常量表达式要求
case 后面必须跟一个常量表达式,这意味着表达式的值在编译时就能确定,而不是在运行时计算得出。常量表达式可以是以下几种形式:
- 整型常量(如 1, 100, -50 等)
- 字符常量(如 'A', 'b', '9' 等)
- 枚举常量
- const 修饰的常量
- 由常量组成的表达式(如 5 + 3, 10 * 2 等)
来看一个简单的例子:
#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 语句更高的执行效率,特别是在处理多个分支的情况下。