### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
switch在英文中是“开关”的意思,比如switch on和switch off可以表示电灯的开关
在C语言中,switch常被用在switch选择语句处,这种语句当然也常被称之为开关语句
switch的作用是:
多重选择、switch语句的标志。
1、switch的基本格式
和if-else结构中if的格式类似,switch后也有一个小括号带着一个表达式,不过这个表达式的结果是有限制的
switch后的表达式和语句内的所有标签只能是整型(char)常量或整型常量表达式的:
/* 常见的用switch去匹配int类型 */
switch (c) /* 格式是:switch关键字后写小括号,括号内写整数常量或整型表达式 */
{
case 1: c++; break; /* case关键字后空格写标签值,也只能是整数常量或整型表达式 */
case 2: c--; break;
default: c = 1; /* default关键字指的是所有标签不匹配的情况下所执行的语句 */
}
/* char类型去比对 */
switch (ch)
{
case 'a': c = 'z'; break;
case 'z': c = 'a'; break;
default: c = 'a';
}
2、switch是怎么运作的
switch之所以称之为开关语句,其实也是源于它的工作原理:
将switch后的表达式值与所有case标签后的表达式从头依次比较,如果匹配(相等),则程序从此标签后开始执行,如果没有匹配项,看default关键字,如果有default,从default处开始执行,否则跳出语句继续往后执行。
看下面这个例子:
switch (c)
{
case 1: /* 如果匹配到1,程序从此处开始执行,1后没有语句,但这里也算是开始的起点 */
case 2: /* 如果匹配到2,程序从此处开始执行,当然匹配到1时,程序也能执行到这里,从break处跳出switch语句 */
c++;
break;
case 3: /* 匹配到3,从此处开始执行c=c+2,注意此处程序有bug */
c += 2;
case 4: /* 匹配到4,开始执行c--,上一条语句之所以有bug,就是因为程序从标签3后开始执行, */
c--; /* 会一直往后执行直到遇到break,所以得到的值可能是不正确的 */
break;
default: /* 没有匹配情况,从default处开始执行 */
c = 0;
}
所以一般我们在一个标签匹配的情况处理完毕后,会加上break语句跳出switch结构,通常default放在最后,且不必写break
那如果default不放在末尾呢?详情请阅读本文末的相关文章-default
3、switch的用法
首先,与if-else不同,switch结构没有嵌套的说法,因为其本身就是一种多重选择结构,不过形式有点不同
比如在一个需要不区分字母大小写输入的系统程序中,switch结构可能会更直观简练:
char c;
int flag;
input(&c); /* 输入一个字母 */
/* if-else结构实现 */
if(c == 'A' || c == 'a')
flag = 0x100;
else if(c == 'B' || c == 'b')
flag = 0x101;
else if(c == 'C' || c == 'c')
flag = 0x102;
……
else
flag = 0x001; /* 报错 */
/* switch结构实现 */
switch (c)
{
case 'A':
case 'a':
flag = 0x100;
break;
case 'B':
case 'b':
flag = 0x101;
break;
case 'C':
case 'c':
flag = 0x102;
break;
……
default:
flag = 0x001; /* 报错 */
}
switch和if-else的选择是平分秋色的,二者都是很好的选择结构,switch相对于if-else的劣势在于,其判断的表达式必须是整型的,
而且switch与for循环很不好配合使用,导致了一些大量数据遍历判断和非整型表达式判断选择的情况不能用switch
但能用switch的时候可以选择使用,一方面是switch的速度比if-else会稍微快一些,另一方面可能带来可读性方面的优化效果
——参考《C Primer Plus第五版》
相关文章: