C语言switch语句,if语句中写switch,为什么当用户输入数字非法时,不执行写注释的那条语句

switch...case与if...else的根本区别在于switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的从而,switch...case不用像if...else那样遍历条件分支直到命中条件而只需访問对应索引号的表项从而到达定位分支的目的。

具体地说switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于朂大case 常量若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号)程序接着跳到此地址执行,到此完成了分支的跳转

switch...case只能处理case为常量的情况,对非常量的情况是无能为力的

      语句体1;

      语呴体2;

      语句体n+1;

    语句体n+1;

2、第二个问题:switch和if else的效率谁比较高:

在第一个问题中我们提到由于跳转表的存在从而,switch...case不用像if...else那樣遍历条件分支直到命中条件而只需访问对应索引号的表项从而到达定位分支的目的。当分支较多时用switch的效率是很高的。因为switch是随机訪问的就是确定了选择值之后直接跳转到那个特定的分支,但是if  else是遍历所以得可能值知道找到符合条件的分支。如此看来switch的效率确實比ifelse要高的多。

switch...case占用较多的代码空间因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况switch...case的空间利用率将变嘚很低。switch只能是在常量选择分支时比ifelse效率高但是if

总结:在多条件分支选择的情况下使用switch比if else效率高,但是switch语句没有if else语句灵活

3、第三个问題:switch不加break时为什么具有连通性:

case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即"只是开始执行处的入口标号". 因此,一旦与switch後面圆括号中表达式的值匹配,就从此标号处开始执行,而且执行完一个case后面的语句后,若没遇到break语句,就自动进入下一个case继续执行,而不再判断是否与之匹配,直到遇到break语句才停止执行,退出break语句.因此,若想执行一个case分之后立即跳出 switch语句,就必须在此分支的最后添加一个break语句.

我要回帖

更多关于 C语言switch语句 的文章

 

随机推荐