免费开源的iOS开发学习平台

OC选择结构:2-switch语句

switch 语句

除了if语句之外,Objective-C语言还提供了用于多分支选择的switch语句, 其一般形式为:

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

其语义是:计算表达式的值, 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。所以为了让程序只执行某个case后面的语句时,我们需要在该case的末尾添加break语句。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 从键盘输入一个数字,数字1~7代表周一~周日,其余的数字打印Error
        int date;
        scanf("%d", &date);
        switch (date) {
            case 1:
                NSLog(@"Monday");
                break;
            case 2:
                NSLog(@"Tuesday");
                break;
            case 3:
                NSLog(@"Wednesday");
                break;
            case 4:
                NSLog(@"Thursday");
                break;
            case 5:
                NSLog(@"Friday");
                break;
            case 6:
                NSLog(@"Saturday");
                break;
            case 7:
                NSLog(@"Sunday");
                break;
            default:
                NSLog(@"Error!");
                break;
        }
    }
    return 0;
}   

运行结果。当我们输入数字1时,打印结果是Monday。

switch中的break语句

假如我们在每个case语句中,不主动添加break语句,那么程序在判断后,会执行后面所有case后的语句。我们把上面的代码进行一些修改,去掉case语句中的break;代码后,再执行一次。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 从键盘输入一个数字,数字1~7代表周一~周日,其余的数字打印Error
        int date;
        scanf("%d", &date);
        switch (date) {
            case 1:
                NSLog(@"Monday");
            case 2:
                NSLog(@"Tuesday");
            case 3:
                NSLog(@"Wednesday");
            case 4:
                NSLog(@"Thursday");
            case 5:
                NSLog(@"Friday");
            case 6:
                NSLog(@"Saturday");
            case 7:
                NSLog(@"Sunday");
            default:
                NSLog(@"Error!");
        }
    }
    return 0;
}

运行后,当我们输入1时,会打印出所有case以及default中执行的代码。因此,在使用switch语句时,每个case语句执行最后,不要忘记添加break。

switch语句的简写方式

在使用switch语句时,有时候会出现很多个case下需要执行的代码都相同,那么可以使用下面的简化形式:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 从键盘输入一个数字,数字1~7代表周一~周日,其余的数字打印Error
        int date;
        scanf("%d", &date);
        switch (date) {
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
                NSLog(@"weekday");
                break;
            case 6:
            case 7:
                NSLog(@"weekend");
                break;
            default:
                NSLog(@"Error!");
                break;
        }
    }
    return 0;
}

上面的代码中case 1~5执行的代码都是一样的,都会打印weekday,case 6~7执行的代码相同,会打印weekend,这样写会比较简洁。

switch语句中定义新变量

如果在switch语句的case中出现定义新变量时,那么case语句冒号后的内容需要加上大括号,否则编译器会报错,其他情况下多行语句可以不适用大括号括起,程序会按顺序执行每一行代码。例如:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int i;
        scanf("%d", &i);
        switch (i) {
            case 1: {
                // case中定义新的变量时需要加上大括号
                int newNumber = 10;
                NSLog(@"newNumber = %d", newNumber);
                break;
            }
            default:
                NSLog(@"Error!");
                break;
        }
    }
    return 0;
}

示例代码

https://github.com/99ios/2.4.2