C++语言中关于switch的用法

关于switch的用法

在一些程序编写中绝对少不了判断语句。
如下面这个用if的简单的判断结构:

#include<iostream>
using namespace std;

int main() {
    
    

	int a = 2, b = 3,sum;
	sum = a + b;
	if (sum=4)
	{
    
    
		cout << "等于4" << endl;
	}
	else if (sum=5)
	{
    
    
		cout << "等于5" << endl;
	}
	return 0;
}

但是这种if的判断语句存在着极大地弊病,就是在每次判断中都要计算一次表达式sum是否等于4或者5,而且表达式 a+b 的结果为一个值,而非一个范围,所以C++就有了switch来解决这种弊病。
用switch改进后的语句如下面:

#include<iostream>
using namespace std;

int main() {
    
    
	int a = 2, b = 3,sum;
	sum = a + b;
	switch (sum)
	{
    
    
	case 4:
		cout << "等于4" << endl; 
		break;
	case 5:
		cout << "等于5" << endl;
		break;
	default:
		break;
	}
	return 0;
}

在经过switch改进后,明显简洁很多,当然在这种及其简单的例子中也行很难体现其最大的优点,但是在日后的程序编写中switch对于程序的可读性和优化等是有一定的帮助的,所以了解和认识switch是一个程序员必备的。
接下来是switch的格式:

  1. switch后面必须有()和{};
  2. 在()中是需要判断的语句和变量(例如上面是判断sum变量的值);
  3. 在{}中是switch核心程序块,用于判断处理;
  4. 在{}中就是使用case关键字来判断;
  5. case后面跟的必须是常量表达式(包括字符表达式)(格式如:case 1:语句;[break;]),表达式可以是C++任何的合法语句,但是其值只能是字符型常量或者整型常量,该常量表达式是用来判断()里面的表达式的值是否与该常量表达式的值相等;
  6. 每个分支case的常量表达式的值必须与某一值严格相等;
  7. case 常量表达式: 其冒号‘:’后面就是判断为True后所要执行的语句,而且最容易让新学者犯错的是,在执行语句后没有加 break 这样可能会导致的错误的结果,如果没有加break的话会继续执行下去,甚至会把其他case后面的语句也执行了,这个结果会在后面讲;
  8. 所有的case 后面可以加上“ default:语句块;break; ” 而且default可以加也可以不加;
  9. 注意 case 后面的 常量表达式的值都是不能相等的;(若判断的值范围较大,则显然是用if语句优于switch语句。)
  10. 在判断过程中发现每个分支case的常量表达式都不符合,则如果有default语句到时候就会执行default语句后面的的语句,如果default没有,则什么也不执行;
  11. 而且,若switch的某一分支的语句不止一句,则所要求的的多条语句也不用写成语句块的形式,只需在最后的语句后面加上break;即可表示在此case的执行语句结束;

switch的格式示意(其中的[]括起来的表示可以加也可以不加):

#include<iostream>
using namespace std;

int main() {
    
    

	switch (表达式)
	{
    
    
	case 常量表达式1: [语句块1] [break; ]
	case 常量表达式2: [语句块2] [break;]
	case 常量表达式3: [语句块3] [break;]
		.
		.
		.
	case 常量表达式n: [语句块n] [break;]
	[default:语句块n + 1;[ break;] ]
	}
	return 0;
}

在这里讲一下,如果在case中的语句最后不加break可能发生的不好结果:

#include<iostream>
using namespace std;

int main() {
    
    
	int a = 1;
	switch (a)
	{
    
    
	case 1: cout << 1 << endl; 
	case 2:  cout << 2 << endl; break;
	case 3: cout << 3 << endl; 

	}
	return 0;
}

在其中的一个分支 case 1:和case 2:的最后没有加break。
执行结果:
执行结果该结果表明:在 case 1: 的执行语句后面没加 break; 的时候,程序不会跳出switch而继续判断下去,使得 case 2: 后面的执行语句也会被执行,知道碰到 break; 才停止,所以只输出了 1 和 2 ,而没有输出 3。
在初学者刚学switch的时候有可能会有这种错误,所以在编写程序的时候一定要考虑break;的重要性。

如果能善于运用bool(布尔)类型的True(1)和Flase(0)也可以用来判断一个范围的值,而不是一个严格的值。
///*********************************************************************///
如我用switch语句实现学生成绩百分制转换成五级记分制:

#include<iostream>
using namespace std;

int main() {
    
    
	
	int x, p;
	cin >> x;
	p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);
	switch (p)
	{
    
    
	case 1:cout << "不及格" << endl; break;
	case 2:cout << "及格" << endl; break;
	case 3:cout << "中等" << endl; break;
	case 4:cout << "良好" << endl; break;
	case 5:cout << "优秀" << endl; break;

	default:
		break;
	}
	
	
}

关键的语句是“p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);”,这是把范围转换为一个严格值的关键,在()里面表达式的值满足bool值为true时,也就是等于1了,而其bool值为false是,也就是等于0了,当然上面范围需是没有交集的,这样才能保证范围转换为一个严格的值时的准确,在准确转化完成后,其余步骤就和正常使用switch那样了。
(如有异议欢迎在评论中提出。)

猜你喜欢

转载自blog.csdn.net/qq_42107431/article/details/109392344