switch的判断条件只能是等于,所以对于数据类型的精度要求比较高。
字符型、布尔型、枚举型都可以转换成整型进行判断,是因为整形在相等不相等上有很大的确定性,而float和double表示的小数,毕竟精度都是有限的,超过限度以后的等于和不等于计算机就不好判定,故不能用。
if else 结构可以用< > 或者一些其他的复杂条件进行判断,所以支持其他类型。
所以,switch只能用于简单的跳转判断,而且一定能被if else 结构代替
switch 为了在编译时生成跳转表(快速跳转),限制了在其之后的元素必须是常量表达式,也即常量的字符或数字。
比如 case 'c',case 1,而不能case c,case i。
switch(x)
{
case 0: break;
case 1 + 1: break; //在编译时已计算表达式,相当于case 2
case 2: break; //重复的case,出错
case 1: break;
default: break;
}
记得之前跟别人讨论过这个问题,大致是这样的:
因为Switch的每个case有入口地址,那如果是int型,就很好计算出每一个case的入口地址,就和你定义一个数组一样
int a[3];
a[1]...数组下标为什么不可以用float型呢,很明显那样查找地址非常不方便.
如果你熟悉asm的话,建议你去看看,这样你就可以理解编译器是如何处理的了.