我对以下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
声明为常量,为什么此代码会出现编译错误?
答案 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语句中最多只能有一个默认标签。