为什么我们不能在switch构造中的case中使用变量?

时间:2015-02-27 08:49:42

标签: c compiler-errors

如果我有一个像int a=4这样的整数变量,那么在切换的情况下如果我写

int b = something;
...
switch(a) 
{ 
  case 4+b: printf("hii"); 
} 

那么为什么这个语句是编译时错误,变量不能在case语句中使用为什么编译器不能代替变量来替换值。

所以基本上它创建的问题是语言开发人员没有将它作为正确的语法包含在内。

3 个答案:

答案 0 :(得分:7)

switch控制流语句的最初想法是,它应该非常快速地确定适当的案例,同时可能有很多案例。

传统的实现将使用跳转表,使其成为O(1)操作。跳转表本质上是一个指针数组,其中每个指针包含每个case的第一条指令的地址。跳转到适当的case就像使用switch值索引该数组,然后对该地址执行jump指令一样简单。

如果允许包含变量的情况,编译器必须发出首先评估这些表达式的代码,然后将switch值与多个其他值进行比较。如果是这种情况,则switch语句只是ifelse if链的语法糖化版本。

switch语句通常是实现有限状态机(如解析器)的任何算法的核心,因此这是将其包含在语言中的一个很好的理由。大多数现代编译器可能会为ifelse if链生成相同的机器代码,这些代码仅针对常量测试变量,但在20世纪70年代早期C的构思时就不是这种情况。此外,switch使你能够在后一种安排中实现堕落。

答案 1 :(得分:2)

case 2+a: doSomething();
          break:
case 4-a: doSomethingElse();
          break;

a==1时你做了什么?

有几种可能的答案,包括

  • 按顺序运行所有适用的案例
  • 以任意顺序运行所有适用的案例
  • 运行第一个适用案例
  • 运行任何一个适用的案例
  • 行为未定义
  • 提出明确定义的错误

问题是,没有一个决议比其他决议更受欢迎。而且,所有这些都与switch语句的原始简单原理相反,后者提供了一个快速,预先计算的索引跳转表的高(ish)级抽象。

答案 2 :(得分:0)

因为它通常是多余的,并且在编译器级别上,您希望跳转到固定地址。只需将变量的依赖项放在switch表达式

switch(a-b) 
{ 
  case 4: printf("hii"); 
}