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 语句更高的执行效率,特别是在处理多个分支的情况下。
ICP备案:
公安联网备案: