选择结构

来源:互联网 发布:杭州程序员招聘网站 编辑:程序博客网 时间:2024/05/17 05:57

1. if else 语句

多用来实现双分支选择结构。
if 语句的一般形式:

if (表达式)语句1; //语句末尾必须有分号
else 语句2;

其中表达式可为个关系表达式、逻辑表达式和数值表达式。
if 语句的衍生形式:

(1) if (表达式)
{ 语句1; }

(2) if (表达式)
{ 语句1; }
else
{ 语句2; }

(3) if (表达式1)
{ 语句1; }
else if (表达式2)
{ 语句2; }
else if (表达式3)
{ 语句3; }
··· ···
else if (表达式n)
{ 语句n; }
else { 语句n+1; }

if选择结构的嵌套:

if ()
{
if () { 语句1 }
else { 语句2 }
}
else
{
if () { 语句3 }
else { 语句4 }
}

2. switch 语句

switch语句的一般形式:

switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
··· ··· ···
case 常量n:语句n
default: 语句n+1
}

(1)switch后面括号内的表达式,其值的类型应为整数类型。
(2)switch下面的花括号内是一个复合语句,case后面跟一个常量或常量表达式
(3)各个case标号出现的次序不影响执行结果。例如,可以先出现default,再出现case。
(4)每一个case常量必须互不相同,多个case标号可共用一组执行语句。
(5)一般在执行一个case语句后,应当用break语句使流程跳出switch,即终止switch语句的执行。

3. if 与 switch 的区别

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

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

当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if···else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。

switch…case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch…case的空间利用率将变得很低。

switch···case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch…case来处理的。所以,switch只能是在常量选择分支时比if···else效率高,但是if···else能应用于更多的场合,if···else比较灵活。