3.1.6 switch语句(2)
由于count变量可能未在switch块中初始化,因此会得到下面的错误消息:
- error C2360: initialization of 'count' is skipped by 'case' label
可以将前面这段代码修改为:
- switch(choice)
- {
- case 1:
- {
- int count = 2;
- cout << "Boil " << count
- << " eggs." << endl;
- // Code to do something with count...
- break;
- }
- default:
- cout << endl << "You entered a wrong number, try raw eggs." << endl;
- break;
- }
如果choice的值与指定的任何Case值都不符合,则执行default标签后面的语句。Default Case不是必需的。在缺少该Case的情况下,如果测试表达式的值与任何case都不符合,则退出switch语句,程序继续执行switch后面的语句。
试一试:共享某种case
switch语句中的每个case表达式都必须是可以在编译期间计算的常量表达式,且必须是互不相同的整数值。任何两个case常量都不能相同,原因是编译器将无法知道应该执行哪条case语句,但是不同的case不一定要采取不同的动作。如下所示,若干case可以共享相同的动作。
- // Ex3_06.cpp
- // Multiple case actions
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- int main()
- {
- char letter(0);
- cout << endl
- << "Enter a small letter: ";
- cin >> letter;
- switch(letter*(letter >= 'a' & & letter <= 'z'))
- {
- case 'a': case 'e': case 'i': case 'o': case 'u':
- cout << endl << "You entered a vowel.";
- break;
- case 0:
- cout << endl << "That is not a small letter.";
- break;
- default: cout << endl << "You entered a consonant.";
- }
- cout << endl;
- return 0;
- }
示例说明
在本示例中,switch语句中的表达式更为复杂。如果输入的字符不是小写字母,则表达式
- (letter >= 'a' && letter <= 'z')
结果为false;否则为true。因为letter要乘以该表达式的值,所以该逻辑表达式的值被转换为整数。如果是false,则转换为0;如果是true,则转换为1。因此,如果输入的不是小写字母,则switch表达式的值为0;如果是小写字母,则该表达式的值就是letter的值。只要letter中存储的字符代码不是小写字母,程序就执行case 0后面的语句。
如果输入的是小写字母,则switch表达式的值与letter的值相同。因此,对于所有对应元音的值来说,输出语句紧随着把元音作为值的case标签的序列执行。无论输入的是哪个元音,执行的都是同一条语句,因为选中这些case标签中的任何一个,都要执行后续的语句,直至遇到break语句为止。我们看到,在要执行的语句之前接连写出各个case标签,就可以为多种不同的case采取相同的动作。如果输入的小写字母是辅音,则执行case标签default后面的语句。