42
int value;

const int signalmin = some_function();

switch(value)
{
   case signalmin:
   break;
}

我读取了 some_function 的值并使用该 int 值来打开 switch case。C99 编译器返回:

错误:案例标签不会减少为整数常量

但我不能使用 a#define因为在开关执行之前正在读取 int 值。

4

6 回答 6

57

switch标签必须是常量表达式,它们必须在编译时进行评估。如果要在运行时值上进行分支,则必须使用if.

一个const-qualified 变量不是一个常量表达式,它只是一个不允许修改的值。

整数常量表达式的形式在6.6(6)【C99和C2011标准的n1570草案】中有详细说明:

6整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、字符常量、sizeof 结果为整数常量的_Alignof表达式、表达式和作为强制类型转换的直接操作数的浮点常量的操作数。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,但作为sizeofor_Alignof运算符的操作数的一部分除外。

仅允许结果为整数常量的表达式的限制sizeof排除了sizeof操作数为可变长度数组的表达式。

于 2012-12-28T12:45:01.680 回答
16

让我举个例子。以下是在设置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块来做到这一点。

于 2013-12-03T10:09:19.100 回答
8

在 C 中,所有case标签都必须是编译时常量。在 C 中,const限定符不会创建编译时常量,它只是指定运行时变量是只读的。

Aswitch不是您要执行的操作的适当控制结构。

于 2012-12-28T12:45:10.230 回答
0

在 C 语言中,变量不能用在 switch case 标签中,而只允许在那里使用常量表达式。

于 2012-12-28T12:48:43.813 回答
0

在 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
于 2014-09-01T00:37:14.720 回答
0

我正在使用下面的代码,它工作正常

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;
}
于 2021-07-30T02:58:04.197 回答