开关错误&案件?

时间:2012-09-06 15:50:11

标签: c

我对以下C代码感到困惑:

int main()
{
 const int i=2;

 switch(2)
 {
   case 1:
     printf("this is case 1");
     break;
   case i:
     printf("it should be case 2");
 }

我知道在关键字case之后,应该有一个常量表达式。

由于已将i声明为常量,为什么此代码会出现编译错误?

4 个答案:

答案 0 :(得分:9)

因为在C中const不是真正的编译时常量。它只是一个只读对象。关于这个问题,有一个C FAQ

答案 1 :(得分:2)

常量变量仍然不是常量表达式。 Constexprs(通常称为)必须包含文字和编译时常量。

答案 2 :(得分:2)

原因:

1. const不能在switch语句中使用。你可以使用#define/enum。请参阅this link

2.第二种情况没有break

3.没有default案例。

4. case之后应该有一个冒号。

答案 3 :(得分:0)

这是因为您在代码中使用变量。您不能在case语句中使用变量。 这里a被假定为变量

  

显式允许编译器使用有效的二叉树或   用于评估案例陈述的跳转表。

     

因此,case语句是编译时常量。

C99标准说明了这一点(和C89标准非常相似):

  

§6.8.4.2开关语句

     

约束

     

¶1switch语句的控制表达式应该是整数   类型。

     

[...]

     

¶3每个case标签的表达式应为整数常量   表达式并没有两个案例常量表达式相同   转换后,switch语句应具有相同的值。也许有   在switch语句中最多只能有一个默认标签。