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:方法。