int value;
const int signalmin = some_function();
switch(value)
{
case signalmin:
break;
}
我读取了 some_function 的值并使用该 int 值来打开 switch case。C99 编译器返回:
错误:案例标签不会减少为整数常量
但我不能使用 a#define
因为在开关执行之前正在读取 int 值。
int value;
const int signalmin = some_function();
switch(value)
{
case signalmin:
break;
}
我读取了 some_function 的值并使用该 int 值来打开 switch case。C99 编译器返回:
错误:案例标签不会减少为整数常量
但我不能使用 a#define
因为在开关执行之前正在读取 int 值。
switch
标签必须是常量表达式,它们必须在编译时进行评估。如果要在运行时值上进行分支,则必须使用if
.
一个const
-qualified 变量不是一个常量表达式,它只是一个不允许修改的值。
整数常量表达式的形式在6.6(6)【C99和C2011标准的n1570草案】中有详细说明:
6整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、字符常量、
sizeof
结果为整数常量的_Alignof
表达式、表达式和作为强制类型转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,但作为sizeof
or_Alignof
运算符的操作数的一部分除外。
仅允许结果为整数常量的表达式的限制sizeof
排除了sizeof
操作数为可变长度数组的表达式。
让我举个例子。以下是在设置4.6.3
了标志的 gcc 版本上测试的-std=c99 -pedantic
:
#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
}
}
正如其他人所指出的,case
无法在运行时评估参数。使用if-else
块来做到这一点。
在 C 中,所有case
标签都必须是编译时常量。在 C 中,const
限定符不会创建编译时常量,它只是指定运行时变量是只读的。
Aswitch
不是您要执行的操作的适当控制结构。
在 C 语言中,变量不能用在 switch case 标签中,而只允许在那里使用常量表达式。
在 OSX 上,clang 似乎毫无怨言地将常量作为案例标签。
#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
我正在使用下面的代码,它工作正常
case "+": 即用双引号我得到一个错误所以试着写
case '+': 单引号
#include <stdio.h>
int main() {
// Write C code here
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;
}