switch 条件判断


switch可用来比较数值或字符,语法架构如下:

switch(变量名称或表达式) {
    case 符合数字或字符:
        语句一;
        break;
    case 符合数字或字符:
        语句二;
        break;
    default:
        陈述三;
        break;
}

首先看看switch的括号,当中置放要取出数值的变量或表达式,获取数值之后,会与case设定的数字或字符比对,如果符合就执行以下的语句,直到遇到break后离开switch区块,若没有符合的数值或字符,会执行default后的语句,default不需要时可以省略。

来看看〈if 条件判断〉中的成绩等级比对,如何使用switch来改写:

#include <iostream>
using namespace std;

int main() { 
    int score = 0; 

    cout << "输入分数:"; 
    cin >> score; 

    switch(score / 10) { 
        case 10: case 9: 
            cout << "得 A" << endl; 
            break; 
        case 8: 
            cout << "得 B" << endl; 
            break; 
        case 7: 
            cout << "得 C" << endl; 
            break; 
        case 6: 
            cout << "得 D" << endl; 
            break; 
        default: 
            cout << "得 E(不及格)" << endl; 
            break;
    } 

    return 0;
}

执行结果:

输入分数:85
得 B

在这个程序中,使用除法并获取运算后的商数,如果大于 90 的话,除以 10 的商数一定是 9 或 10(100 分时),在case 10中没有任何的陈述,也没有使用break,因此继续往下执行,直到遇到break离开switch为止,所以学生成绩100分的话,也会显示 A 的成 绩等级;如果比对的条件不在 10 到 6 这些值的话,会执行default下的陈述,这表示商数小于 6,学生的成绩等级就显示为 E 了。

case中若定义并初始化变量,以下是不合法的:

switch(v) {
    case 1: 
        int x = 0; // 定义并初始化变量
        cout << x << endl;
        break;
    default: // error: jump to case label
             // note:   crosses initialization of 'int x'
        cout << "default\n";
        break;
}

这是因为以上的代码中,defaultcase属于同一区块,而初始化可能被跳过,如果真的要在case中若定义并初始化变量,必须明确定义另一个区块:

switch(v) {
    case 1: 
        {
            int x = 0; // 定义并初始化变量
            cout << x << endl;
        }
        break;
    default: 
        cout << "default\n";
        break;
}

多数的开发者习惯将default写在switch最后,在这类情况下,default中的break常会省略;不过实际上,default也可以写在一开始:

switch(变量名称或表达式) {
    default:
        陈述三;
        break;
    case 符合数字或字符:
        语句一;
        break;
    case 符合数字或字符:
        语句二;
        break;
}

这时就得记得写break了,有些开发者也因此有个习惯,无论default是写在开头或结尾,都会加上break

对于底下的写法:

int size = foo.getSize();
switch(size) {
    //...
}

size如果只用于switch判断或其区块,在 C++ 17 时可以写为(目前我用的 g++ 必须加上-std=c++17才可以通过编译):

switch(int size = foo.getSize(); size) {
    //...
}




展开阅读全文