#define SOME_HARDCODED_CONSTANT 0 //good
int foo(int i, int b){
const int c=0; //bad
int a=0; //bad
switch(i){
case c: //compile error
case a: //compile error.
case (b+a): //compile error
case SOME_HARDCODED_CONSTANT: //all good
case 5: //all good
}
}
#include <stdio.h>
int main() {
char x;
int a = 20, b = 10;
scanf("%c", &x);
switch (x) {
case '+':
printf("%d", a + b);
break;
case '-':
printf("%d", a - b);
break;
case '*':
printf("%d", a * b);
break;
case '/':
printf("%d", a / b);
break;
default:
printf("sorry");
}
return 0;
}
#include <stdio.h>
#define SOME_HARDCODED_CONSTANT 0 //good for sure
int foo(int i, int b){
const int c=1; //no problem!!!
switch(i){
case SOME_HARDCODED_CONSTANT: //all good
printf("case SOME_HARDCODED_CONSTANT\n"); break;
case c: //no compile error for clang
printf("case c\n"); break;
case 5: //all good
printf("case 5\n"); break;
}
return i+b;
}
int main() {
printf("test foo(1,3): %d\n", foo(1,3));
}
输出:
$> cc test.c -o test; ./test
case c
test foo(1,3): 4
6条答案
按热度按时间li9yvcax1#
switch
标签必须是常量表达式,它们必须在编译时计算。如果您希望在运行时值上分支,则必须使用if
。一个
const
限定的变量不是一个 * 常量表达式 *,它只是一个不允许修改的值。整数常量表达式的形式在6中详细介绍。6(6)[C99和C2011标准的n1570草案]:
6一个 integer constant expression 必须是integer类型,并且只能有整型常量、枚举常量、字符常量、结果是整型常量的
sizeof
表达式、_Alignof
表达式和作为转换的直接操作数的浮点常量。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为sizeof
或_Alignof
运算符的操作数的一部分。仅允许结果为整数常量的
sizeof
表达式的限制排除了操作数为可变长度数组的sizeof
表达式。khbbv19g2#
让我插进来举个例子。以下代码在gcc版本
4.6.3
上进行了测试,并设置了-std=c99 -pedantic
标志:正如其他人所指出的,
case
参数不能在运行时计算。使用一个if-else
块来实现这一点。dxxyhpgq3#
在C中,所有
case
标签必须是 * 编译时 * 常量。在C语言中,const
限定符并不创建编译时常量,它只是指定运行时变量是只读的。switch
不是您尝试执行的适当控制结构。deyfvvtc4#
我正在使用下面的代码,它运行良好。
使用
case "+":
i时出现错误。例如,使用双引号,所以尝试使用单引号编写case '+':
。yhxst69z5#
在C语言中,变量不能用在开关大小写标签中,而只有常量表达式才允许用。
xbp102n06#
在OSX上,clang似乎毫无怨言地将常量作为大小写标签。
输出: