6.2 switch语句

这种类型的if-else语句和上一个程序例子有关(其中一个变量的值与不同的值连续进行比较),开发包含Objective-C语言中特有程序语句的程序,以便精确地执行这种功能时,经常用到这种功能。该语句的名称为switch语句,它的一般格式如下:


switch(expression)

{

case value1:

program statement

program statement

……

break;

case value2:

program statement

program statement

……

break;

……

case valuen:

program statement

program statement

……

break;

default:

program statement

program statement

……

break;

}


括在圆括号中的expression与value1、value2,……,valuen连续进行比较,后者必须是单个常量或常量表达式。如果发现某种情况下某个Value的值与expression的值相等,就执行该情况之后的程序语句。注意,包含多条这样的程序语句时,它们不必括在圆括号中。

break语句表示一种特定情况的结束,并导致switch语句的终止。记住,每种情况的结尾都要包含break语句。如果忘记为特定的情况执行这项操作,只要执行这种情况,程序就会继续执行下一种情况。有时需要有意这么做;如果选择这样的方式,请务必插入注释以便将你的目的告知他人。

如果expression的值不与任何情况的值匹配,将执行一种特殊的、名为default的可选情况。这在概念上等价于前一个例子中使用的else。事实上,switch语句的一般格式可以等价地表示成以下if语句:


if(expression==value1)

{

program statement

program statement

……

}

else if(expression==value2)

{

program statement

program statement

……

}

……

else if(expression==valuen)

{

program statement

program statement

……

}

else

{

program statement

program statement

……

}


记住前面的代码,可以将代码清单6-8A中的大型if语句转换成等价的switch语句。我们把这个新程序叫做代码清单6-9。

代码清单6-9


//Program to evaluate simple expressions of the form

//value operator value

import<Foundation/Foundation.h>

//Insert interface and implementation sections for

//Calculator class here

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

double value1,value2;

char operator;

Calculator*deskCalc=[[Calculator alloc]init];

NSLog(@“Type in your expression.”);

scanf(“lf%c%lf”,&value1,&operator,&value2);

[deskCalc setAccumulator:value1];

switch(operator){

case‘+’:

[deskCalc add:value2];

break;

case‘-’:

[deskCalc subtract:value2];

break;

case‘*’:

[deskCalc multiply:value2];

break;

case‘/’:

[deskCalc divide:value2];

break;

default:

NSLog(@“Unknown operator.”);

break;

}

NSLog(@“.2f”,[deskCalc accumulator]);

[deskCalc release];

[pool drain];

return 0;

}


代码清单6-9输出


Type in your expression.

178.99-326.8

-147.81


在读入表达式之后,operator的值会连续与每种情况指定的值进行比较。发现一个匹配的值时,将执行包含在这种情况中的语句。然后,break语句将终止switch语句的执行,程序也会在此处结束。如果不存在匹配operator值的情况,将执行可显示“Unkown operator.”的default语句。

以上程序中,default情况中的break语句实际上不是必需的,因为这种情况之后的switch中不存在任何语句。然而,记住在每种情况的结尾都包含break语句是一种良好的程序设计习惯。

编写switch语句时,应该记住任何两种情况的值都不能相同。然而,可以将多个情况的值与一组程序语句关联起来。简单地在要执行的普通语句之前列出多个情况的值(每种情况中值的前面都使用关键字case,而且后面要有一个冒号)就能实现该任务。作为一个例子,在以下switch语句中,


switch(operator)

{

……

case‘*’:

case‘x’:

[deskCalc multiply:value2];

break;

……

}


如果operator等于星号或是小写字母x,将执行multiply:方法。