### switch 语句

在介绍 switch 语句之前，我们作一个练习。首先定义一个枚举类型，分别表示星期日至星期六。然后定义一个枚举变量，根据枚举变量的值输出当前是星期几。

使用 if 语句进行多条件判断

首先定义一个枚举类型，表示星期信息。

typedef enum Week{ SUN, MON, TUES, WED, THURS, FRIDAY, SAT};

然后定义一个枚举变量，进行初始化。

Week day = WED;

最后利用 if 语句来判断枚举变量 day 的值，并输出相应的星期信息。

if (day == SUN) //如果为星期日

{

cout << "星期日" << endl;

}

else if (day == MON) //如果为星期一

{

cout << "星期一" << endl;

}

else if (day == TUES) //如果为星期二

{

cout << "星期二" << endl;

}

else if (day == WED) //如果为星期三

{

cout << "星期三" << endl;

}

else if (day == THURS) //如果为星期四

{

cout << "星期四" << endl;

}

else if (day == FRIDAY) //如果为星期五

{

cout << "星期五" << endl;

}

else if (day == SAT) //如果为星期六

{

cout << "星期六" << endl;

}

对于这样简单，但又需要进行多次判断的逻辑条件，使用 if 语句来描述非常麻烦。C++语言提供了一个 switch 语句，它能够测试一组有序类型（整型、字符型、枚举型、布尔类型等）的数据，发现匹配的常量时，它将执行与该常量关联的语句。switch 语句的语法格式为：

switch (表达式)

{

case 常量 1:

语句;

break;

case 常量 2:

语句;

break;

case 常量 3:

语句;

break;

……

default:

语句;

}

其中，表达式必须是有序类型，不能够是实数或字符串类型。表达式逐一与 case 语句部分的常量匹配，如果发现有常量与表达式相匹配，则执行当前 case 部分的语句，直到遇到 break 语句位置，或者到达 switch 语句的末尾（没有遇到 break 语句）。当表达式没有发现与之匹配的常量，将执行 default 部分的代码。default 语句是可选的，如果代码中没有提供 default 语句，并且没有常量与表达式匹配，switch 语句将不执行任何动作。

下面利用 switch 语句代替 if 语句来实现星期的判断。

使用 switch 语句进行多分支条件判断

switch(day)

{

case SUN:

cout << "星期日" << endl;

break;

case MON:

cout << "星期一" << endl;

break;

case TUES:

cout << "星期二" << endl;

break;

case WED:

cout << "星期三" << endl;

break;

case THURS:

cout << "星期四" << endl;

break;

case FRIDAY:

cout << "星期五" << endl;

break;

case SAT:

cout << "星期六" << endl;

break;

}

分析 switch 语句和 if 语句各自实现的星期判断，他们实现的功能是相同的，但是使用 switch 语句使程序代码更加清晰。在 switch 语句中，如果多个 case 常量需要进行相同的处理，可以将多个 case 语句组织在一起，执行同一个语句块。例如，如果当前是星期六或星期日，则输出休息日，否则输出工作日。可以采用下面的方式编写 switch 语句。

switch(day)

{

case SUN: //对多个常量进行相同的处理

case SAT:

{

cout << "休息日" << endl;

break;

}

case MON: //对多个常量进行相同的处理

case TUES:

case WED:

case THURS:

case FRIDAY:

{

cout << "工作日" << endl;

break;

}

}

switch 语句中的 break 语句属于跳转语句，也可以用于循环语句中。在 switch 语句中，当遇到 break 语句时，程序将跳转到 switch 语句之后的下一行代码处。如果在 switch 语句中没有使用 break 语句，当表达式与某个常量匹配时，将执行当前 case 语句代码，并且继续向下执行 case 语句的代码，直到遇到 break 语句或者 switch 语句结束。例如，下面的 switch 语句在判断星期时，没有使用 break 语句。

使用 switch 语句未使用 break 语句

Week day = WED; //定义一个枚举变量

switch(day)

{

case SUN:

cout << "星期日" << endl;

//break;

case MON:

cout << "星期一" << endl;

//break;

case TUES:

cout << "星期二" << endl;

//break;

case WED:

cout << "星期三" << endl;

//break;

case THURS:

cout << "星期四" << endl;

//break;

case FRIDAY:

cout << "星期五" << endl;

//break;

case SAT:

cout << "星期六" << endl;

//break;

}

运行结果如图 1 所示。

图 1 break 语句

由于在 switch 语句中没有使用 break 语句，当表达式 day 与 WED 常量匹配时，没有遇到 break 语句，并且 switch 语句没有结束，因此继续向下执行，执行了其后的所有 case 语句。在开发程序时，这通常不是预期的结果，因此，在编写 switch 语句时，注意不要遗忘 break 语句。如果确实需要在 case 语句部分省略 break 语句，则应在 case 语句部分标记注释，表明这是程序需要才省略了 break 语句，而不是遗忘了 break 语句。

与 if 语句类似，在 switch 语句的表达式部分也可以声明一个变量，变量的作用域为整个 switch 语句块，在 switch 语句之外，无法访问该变量。此时，switch 语句将变量的初始值与各个 case 常量值比较，如果匹配，执行相应的 case 语句。下面的语句在 switch 表达式中定义枚举变量，判断其表示的星期信息。

使用 switch 语句输出星期信息

#include "stdafx.h"

#include <iostream.h>

typedef enum Week{ SUN, MON, TUES, WED, THURS, FRIDAY, SAT}; //定义枚举类型，表示星期

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

{

switch(enum Week day = WED) //在 switch 表达式中定义一个变量

{

case SUN:

cout << "星期日" << endl;

break;

case MON:

cout << "星期一" << endl;

break;

case TUES:

cout << "星期二" << endl;

break;

case WED:

cout << "星期三" << endl;

break;

case THURS:

cout << "星期四" << endl;

break;

case FRIDAY:

cout << "星期五" << endl;

break;

case SAT:

cout << "星期六" << endl;

break;

}

return 0;

}

注意：在 switch 语句的 case 子句或 default 子句部分定义变量是非法的，除非将 case 部分的语句防止在复合语句中。例如，下面的 switch 语句是非法的。

switch(enum Week day = WED)

{

case SUN:

cout << "星期日" << endl;

int nLen = 100; //语法错误，在 case 语句部分不能声明变量

break;

}

在上面的代码中，如果将 case 语句部分使用复合语句，则在 case 语句中声明变量是合法的。例如：

switch(enum Week day = WED)

{

case SUN:

{

cout << "星期日" << endl;

int nLen = 100;

break;

}

}