枚举类型定义出枚举的第一项和最后一项 做为循环边界
把枚举的第一个元素留作非法值。
enum Country
{
Country_InvalidFirst = 0;
...
Country_Last
};
if 里放正常情况 else里放出错 少见情况
switch部分被分配了一个连续的查找 表,switch case中不连续的部分也被添加上了相应的条目,switch表的大小不是根据case语 句的多少,而是case的最大值的最小值之间的间距。在选择相应 的分支时,会先有一个cmp子句,如果大于查找表的最大值,则跳转到default子句。而其他所有的case语句的耗时都回事O(1)。
相比于if-else结构,switch的 效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一个连续的常量。而if-else则可以灵活的多。
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
2. 为什么 case 语句在不加break的时候具有直通性?
这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。
zz from http://topic.csdn.net/u/20070410/11/3341e77a-5b85-4f0c-b6a0-522fb899dc44.html