1

我对以下 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

4 回答 4

9

因为在 C 中 aconst不是真正的编译时常量。它只是一个只读对象。关于这个主题有一个C 常见问题解答。

于 2012-09-06T15:51:39.827 回答
2

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

于 2012-09-06T15:51:56.373 回答
2

原因:

1.const不能在switch语句中使用。你可以用一个#define/enum。请参阅此链接

2.第二种情况没有break

3.没有default案例。

4.后面应该有一个冒号case

于 2012-09-06T15:57:31.650 回答
0

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

编译器被明确允许使用高效的二叉树或跳转表来评估 case 语句。

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

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

§6.8.4.2 switch 语句

约束

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

[...]

¶3 每个 case 标签的表达式应为整数常量表达式,同一 switch 语句中的任何两个 case 常量表达式在转换后不得具有相同的值。switch 语句中最多可以有一个默认标签。

于 2012-09-06T15:52:25.427 回答