switch语句的GCC拓展
一般的C语言规范中我们认为case语句后面紧跟着就是整形数据,但是在gcc/g++中case语句后面可以接一个范围,其语法如下:
switch(data)
{
case low_1 ... hight_1 : func1(); break;
case low_2 ... hight_2 : func2(); break;
……
default : funcDefault(); break;
}
可能出现的错误
注意:
- 如果有以下的报错,可能是你的编译器不是gcc/g++
error: too many decimal points in number
- 如果有以下的错误,那么你的参数值可能有重复
error: duplicate (or overlapping) case value
- 如果有以下的错误,那么你的第一个参数与英文句号之间没有空格
error: expected ‘:’ or ‘…’ before numeric constant
举例
以下是一个输入成绩出现评分的例子,如果是标准C语言,我们想要实现它只有通过if-else语句实现,如果使用gcc编译器的话现在使用switch-case语句就可以实现了。并且由于switch语句使用的是压栈的方式进行,在处理多层数据的时候表现要优于if-else语句,当然如果只有以下的4层结构使用if-else在代码的执行上更有优势,但是使用switch-case语句在代码表现上更加好看。
#include<stdio.h>
int main() {
float score;
int grade;
scanf("%f",&score);
printf("Your Grade:");
grade = (int) score;
switch(grade)
{
case 85 ... 100:printf("A\n");break;
case 70 ... 84:printf("B\n");break;
case 61 ... 69:printf("C\n");break;
case 0 ... 60:printf("D\n");break;
default : printf("ERROR\n");
}
return 0;
}
GCC的其余拓展
当然 GNU c 标准还支持了其他拓展,例如:
- 允许零长度数组
- 语句表达式
- typeof关键字
- 可变参数的宏
- 标号元素
……
以上列举了一些特殊的拓展,大家有兴趣的话可以自己去看一下 GNU C 的语法。