我对以下 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
为常量,为什么此代码会出现编译错误?
我对以下 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
为常量,为什么此代码会出现编译错误?
因为在 C 中 aconst
不是真正的编译时常量。它只是一个只读对象。关于这个主题有一个C 常见问题解答。
常量变量仍然不是常量表达式。constexprs(通常称为)必须仅包含文字和编译时常量。
原因:
1.const
不能在switch语句中使用。你可以用一个#define/enum
。请参阅此链接。
2.第二种情况没有break
。
3.没有default
案例。
4.后面应该有一个冒号case
。
这是因为您在代码中使用了变量。您不能在 case 语句中使用变量。这里 a 被假定为变量
编译器被明确允许使用高效的二叉树或跳转表来评估 case 语句。
因此,case 语句是编译时常量。
C99 标准说明了这一点(C89 标准非常相似):
§6.8.4.2 switch 语句
约束
¶1 switch 语句的控制表达式应为整数类型。
[...]
¶3 每个 case 标签的表达式应为整数常量表达式,同一 switch 语句中的任何两个 case 常量表达式在转换后不得具有相同的值。switch 语句中最多可以有一个默认标签。