C++ 中的 switch 语句
在本文中,我们将了解 C++ 中的 switch
语句及其特殊属性。
C++ 中的 switch-case
语句
switch-case
根据其值评估表达式,并针对 case
语句中存在的常量值列表进行测试,以根据不同的 case
执行不同的操作。
与 if-else
一样,switch 语句是控制流语句,因为它们可以改变程序的一般流程,因为它允许表达式或变量通过 多路分支
控制流程。
语法:
switch(variable / expression)
{
case constant-expression 1:
statements;
case constant-expression 2:
statements;
}
示例代码:
#include<iostream>
using namespace std;
int main()
{
int day = 3;
switch(day)
{
case 1 :
cout<<"Monday\n";
case 2 :
cout<< "Tuesday\n";
case 3 :
cout<<"Wednesday\n";
case 4 :
cout<<"Thursday\n";
case 5 :
cout<<"Friday\n";
case 6 :
cout<<"Saturday\n";
case 7 :
cout<<"Sunday\n";
}
}
输出:
Wednesday
Thursday
Friday
Saturday
Sunday
变量 day = 3
的值被评估并与相应的 case 语句 case 3
匹配,并且它包含的语句"Wednesday"
被打印,但我们仍然得到剩余的字符串,因为一旦控制转到 case 3
,从那里到 switch 块结束的所有内容,所有语句都被打印/评估。
这就是为什么要打印来自 cases
4,5,6,7 的语句的原因。
为了避免这种情况,我们必须修改我们的 switch-case
结构。
语法 - 修改 switch-case
:
switch(variable / expression)
{
case constant-expression 1:
statements;
break; (optional)
case constant-expression 2:
statements;
break; (optional)
default: //default statment optional
statements;
break;
}
break
关键字用于停止 switch 块的执行并退出它。一旦条件/案例匹配,我们评估语句,中断流程,并从 switch 块中出来。
default
关键字指定在没有大小写匹配时执行的语句。
示例代码:
#include<iostream>
using namespace std;
int main()
{
int day = 3;
switch(day)
{
case 1 :
cout<<"Monday\n";
break;
case 2 :
cout<< "Tuesday\n";
break;
case 3 :
cout<<"Wednesday\n";
break;
case 4 :
cout<<"Thursday\n";
break;
case 5 :
cout<<"Friday\n";
break;
case 6 :
cout<<"Saturday\n";
break;
case 7 :
cout<<"Sunday\n";
break;
default:
cout<<"Wrong option entereted\n";
break;
}
}
输出:
Wednesday
在下一个示例中,我们还可以使用 char
进行切换。我们将看到一个检查字符是元音还是辅音的示例代码。
示例代码:
#include<iostream>
using namespace std;
int main()
{
char x = 'u';
switch(x)
{
case 'a':
cout<<"Vowel";
break;
case 'e':
cout<<"Vowel";
break;
case 'i':
cout<<"Vowel";
break;
case 'o':
cout<<"Vowel";
break;
case 'u':
cout<<"Vowel";
break;
default:
cout<<"Consonant";
break;
}
}
输出:
Vowel
在 C++ 中使用 Switch Case 的规则和属性
-
switch
语句中使用的表达式应该是constant value
。否则将被视为无效。在这里我们可以看到,只要为它们分配了固定值,就可以使用常量和变量表达式。
switch(1+2+3*4+5) switch(a+b+c*d)
-
default
和break
是可选的。即使switch-case
没有它们,它也可以毫无问题地运行。 -
switch
语句的嵌套是有效的,意味着我们可以在另一个语句中切换语句。虽然这不是一个好的编程习惯,但我们仍然可以利用它们。#include<iostream> using namespace std; int main() { int ID = 1234; int password = 000; switch (ID) { case 1234: cout<<"checking info......\n"; switch(password) { case 000: cout<<"Login successful\n"; break; default: cout<<"Password don't match please check it\n"; break; } break; default: printf("incorrect ID"); break; } }
输出:
checking info...... Login successful
-
switch
语句中使用的表达式必须是整数类型,这意味着它应该是int
、char
或enum
。否则我们会得到一个编译错误。#include<iostream> using namespace std; int main() { float x = 12.34; switch(x) { case 1.1: cout<<"Yes"; break; case 12.34: cout<<"NO"; break; } }
输出:
```text
[Error] switch quantity not an integer
```
-
default
块可以在switch
内,但仅在没有匹配的情况下执行。#include<iostream> using namespace std; int main() { int x = 45; switch (x) { default: cout<<"It's not 1 or 2"; break; case 1: cout<<"It's a 1"; break; case 2: cout<<"It's a 2"; break; } }
输出:
It's not 1 or 2
-
case 上面写的语句永远不会执行。一旦
switch
语句被评估,控制转移到匹配的情况或default
块(如果存在)。#include<iostream> using namespace std; int main() { int x = 45; switch (x) { cout<<"Tony is Iron Man\n"; case 1: cout<<"It's a 1"; break; case 2: cout<<"It's a 2"; break; default: cout<<"It's not 1 or 2"; break; } }
输出:
```text
It's not 1 or 2
```
-
不允许重复的案例标签。如果给出,我们将得到一个编译错误。
#include<iostream> using namespace std; int main() { int x = 45; switch (x) { case 45: cout<<"Iron Man"; break; case 40+5: cout<<"tony stark"; break; default: cout<<"It's not 1 or 2"; break; } }
输出:
[Error] duplicate case value
-
案例标签也应该是不变的。否则,我们会得到一个编译错误。
#include<iostream> using namespace std; int main() { int x = 2; int arr[] = {100, 200, 300}; switch (x) { case arr[0]: cout<<"Iron Man"; break; case arr[1]: cout<<"tony stark"; break; case arr[2]: cout<<"It's not 1 or 2"; break; } }
输出:
[Error] the value of 'arr' is not usable in a constant expression
-
我们可以对执行相同任务的所有
case
语句进行分组。#include<iostream> using namespace std; int main() { char x = 'A'; switch(x) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'A': case 'E': case 'I': case 'O': case 'U': cout<<"Vowel"; break; default: cout<<"consonant"; } }
C++ 中 switch
语句和 if-else
语句之间的区别
当我们有许多 if-else
语句时,编译器必须检查所有语句,直到找到有效匹配。而在 switch-case
中,如果我们只想运行某个代码块,并且满足某个条件,则使用语句。
以下示例检查字符是否为字母表。
示例代码:
char x = '+';
if(x=='A')
....
else if(x=='B')
...
else if(x=='C')
...
....
else
cout<<"Not an alphabet"
由于+
不是字母表,到达最后一个需要更长的时间,因为它必须首先检查每个先前的条件。如果使用 switch-case
实现,当案例/条件的数量非常大时,它会使用查找表或哈希列表。
这意味着所有项目都获得相同的访问时间。所以,当我们有很多 cases/conditions
时,switch
比 if-else
更受欢迎,因为它更快。