如果我有一个像int a=4
这样的整数变量,那么在切换的情况下如果我写
int b = something;
...
switch(a)
{
case 4+b: printf("hii");
}
那么为什么这个语句是编译时错误,变量不能在case语句中使用为什么编译器不能代替变量来替换值。
所以基本上它创建的问题是语言开发人员没有将它作为正确的语法包含在内。
答案 0 :(得分:7)
switch
控制流语句的最初想法是,它应该非常快速地确定适当的案例,同时可能有很多案例。
传统的实现将使用跳转表,使其成为O(1)
操作。跳转表本质上是一个指针数组,其中每个指针包含每个case
的第一条指令的地址。跳转到适当的case
就像使用switch
值索引该数组,然后对该地址执行jump
指令一样简单。
如果允许包含变量的情况,编译器必须发出首先评估这些表达式的代码,然后将switch
值与多个其他值进行比较。如果是这种情况,则switch
语句只是if
和else if
链的语法糖化版本。
switch
语句通常是实现有限状态机(如解析器)的任何算法的核心,因此这是将其包含在语言中的一个很好的理由。大多数现代编译器可能会为if
和else 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");
}