C++ 中的 switch 语句

Suraj P 2023年1月30日 2022年4月20日
  1. C++ 中的 switch-case 语句
  2. 在 C++ 中使用 Switch Case 的规则和属性
  3. C++ 中 switch 语句和 if-else 语句之间的区别
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 的规则和属性

  1. switch 语句中使用的表达式应该是 constant value。否则将被视为无效。

    在这里我们可以看到,只要为它们分配了固定值,就可以使用常量和变量表达式。

    switch(1+2+3*4+5)
    switch(a+b+c*d)
    
  2. defaultbreak 是可选的。即使 switch-case 没有它们,它也可以毫无问题地运行。

  3. 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
    
  4. switch 语句中使用的表达式必须是整数类型,这意味着它应该是 intcharenum。否则我们会得到一个编译错误。

    #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
```
  1. 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
    
  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
```
  1. 不允许重复的案例标签。如果给出,我们将得到一个编译错误。

    #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
    
  2. 案例标签也应该是不变的。否则,我们会得到一个编译错误。

    #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
    
  3. 我们可以对执行相同任务的所有 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 时,switchif-else 更受欢迎,因为它更快。

Author: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

相关文章 - C++ Statement