c++ 条件控制语句 if语句 switch语句

条件控制语句

条件操作符,其作用是根据条件的真假返回两个表达式中的一个,这样虽然可以达到条件控制的目的,但是只能返回一个值,如果我们想要在条件分支中做许多事情,那就需要条件控制语句了。
条件控制语句可以看做是一个框架,我们需要填充其中的条件表达式和每个分支中需要执行的表达式。

if 语句

if语句是一种基本的条件控制语句,它的语法基本跟自然语言中的英语一样(if something happens, do something)。if语句后面还可以选择的加上 else 语句(if something happen,do something ,else ,do other things)。
基本if语句

#include <iostream>
using namespace std;
//基本if语句

int main()
{
	int num = 5 ;
	if ( num > 4 )
		cout <<"数字大于4." << endl;
	num = 3 ;
	if ( num > 4 )
		cout << "数字大于4。" << endl;
	else
		cout << "数字小于等于4." << endl;
	return 0 ;
}

结果:
在这里插入图片描述
if关键字后面跟着用括号括住的表达式,下面跟着的一句会在条件满足的时候运行。
示例中 ,由于一开始时num= 5,因此满足条件num>4,会打印句子。我们也可以加上else关键字和一个语句,这样第二个语句将会在条件不满足的情况下运行。由于后来将num改为3,条件不满足,因此程序执行else后的句子,打印句子。
由于这样的句子只能在if或else后面添加一个语句,我们还是需要能处理多行语句的语法。
多行if语句

#include<iostream>
using namespace std;

//多行if语句

int main()
{
	int num = 5 ;
	int cnt = 0 ;
	if ( num > 4 )
	{
		cout << "数字大于4." << endl;
		cnt++;
	}
	num = 3 ;
	if (num > 4)
	{
		cout << "数字大于4。" << endl;
		cnt++;
	}
	else 
	{
		cout << "数字小于等于4." <<endl;
		cnt++;
	}
	
	cout << "cnt=" <<cnt <<endl;

	return 0;
}

运行结果:
在这里插入图片描述
例子展示了带有许多行语句的if语句用法,这与基本if语句的区别就在于他需要使用花括号{}把条件分支中的语句全都框起来。这是因为在没有花括号的情况下,if只能覆盖一个语句,而不能覆盖多行语句。

为了增强程序的可读性,我们一般会在不同的场合为语句添加缩进(一般只要看到左花括号就缩进,看到右花括号就减少缩进)。缩进在c++中只会被当做空格处理,并不会对语义造成任何影响。
else if 的应用:

#include <iostream>
using namespace std;

//else if 的应用

int main()
{
	int num = 5;
	if (num < 4)
	{
		cout << "数字小于4." <<endl;
	}
	else if ( num > 6)
	{
		cout << "数字大于6." << endl;
	}
	else 
	{
		cout << "数字在4和6之间。" <<endl;\
	}
	return 0;
}

运行结果:
在这里插入图片描述
示例中,我们通过在else后面在增加一个if…else语句的方法增加了一个条件分支,程序num>4不成立的情况下进入下一个条件的判断,直到所有条件都满足时,程序走进else分支。
上述语法适合同一个数值有多个区间的情形,但有的时候我们也会需要层层递进的条件分支,这个时候就可以在if语句中嵌套if语句。
示例:

#include<iostream>
using namespace std;
//嵌套if语句

int main()
{
	bool isNorth = true;
	bool isWest = false;
	if ( isNorth )
	{
		if (isWest)
		{
			cout <<"西北方向!" << endl;
		}
		else
		{
			cout << "东北方向!" << endl;
		}
	}
	else
	{
		if (isWest)
		{
			cout << "西南方向!" << endl;
		}
		else
		{
			cout << "东南方向!" << endl;
		}
	}
	return 0 ;
}

运算结果:
在这里插入图片描述
嵌套if语句的时候,我们可以随意组合之前提到过的任何语法,然而else if的语法本质上就是省略了else后面花括号中的嵌套if语句。
在使用嵌套if语句的时候我们也要注意花括号的添加,这不仅仅是因为多行语句的问题。

悬垂 else:

#include<iostream>
using namespace std;
//悬垂else

int main()
{
	int a = 4;
	if ( a > 3 )
		if ( a > 5 )
			cout <<"a大于5!" << endl;
	else
	cout << "a小于等于3!" <<endl;
	return 0;
}

运行结果:
在这里插入图片描述
示例中,我们可以看到a的值为4,但是程序的运行结果却是“a小于等于3”。这是因为没有加上适当的花括号,else无法判断自己与哪个if配对,编译器就只能选择最近的if语句进行打印,所以else相当于是挂在了a>5的条件之后,而不是a>3之后。这种情况再次说明了缩进在 c++中对编译毫无影响。

switch语句

在说switch语句前,看一个不是很理想的if语句的示例
使用if else 语句打印一位数中文数字:

#include<iostream>
using namespace std;
//打印一位中文数字

int main()
{
	int num = 6 ;
	if (num == 0){
		cout << "零" << endl;
	}
	else if (num == 1){
		cout << "一" << endl;
	}
	else if (num == 2){
		cout << "二" << endl;
	}
	else if (num == 3){
		cout << "三" << endl;
	}
	else if (num == 4){
		cout << "四" << endl;
	}
	else if (num == 5){
		cout << "五" << endl;
	}
	else if (num == 6){
		cout << "六" << endl;
	}
	else if (num == 7){
		cout << "七" << endl;
	}
	else if (num == 8){
		cout << "八" << endl;
	}
	else if (num == 9){
		cout << "九" << endl;
	}
	else {
		cout << "数字不在0-9范围内!" << endl;
	}
	return 0 ;
}

输出结果为:
在这里插入图片描述例子使用多个else if打印中文数字,这样的写法有些烦恼,也容易出错。对于不同区间的判断,我们可以使用多个if…else语句来实现,但是对于类似枚举值的多个相等判断条件来说,c++提供了一种更合适的语法,也就是switch语句。
使用switch语句打印一位数中文数字:

#include<iostream>
using namespace std;
//使用switch语句打印一位数中文数字

int main()
{
	int num = 6 ;
	switch (num)
	{
		case 0:
			cout << "零" << endl;
			break;
		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;
		case 6: 
			cout << "六" << endl;
			break;
		case 7: 
			cout << "七" << endl;
			break;
		case 8: 
			cout << "八" << endl;
			break;
		case 9:
			cout << "九" << endl;
			break;
		default :
			cout << "数字不在0-9之间!" << endl;
			break;
	}
	return 0 ;
}

运行结果为:
在这里插入图片描述可以看出,两个程序的运行结果完全相同。
switch语句开头的括号中是一个表达式,而其下面的每个case都是这个表达式可能得到的值,每一个不同的值都会走近一段不同的代码。表达式的值如果没有出现在所有case后面,就会自动落到default(默认)的代码段中。

提示:case后面必须是常量整型(包括字符型和布尔型),如果不是常量整数,编译器编译的时候就无法确定分支的条件,那也就失去了使用switch语句优化的好处(编译器会对switch生成一种跳转表的优化结构)。如果case后面是常量的浮点型也没有什么意义,因为浮点数相等于一个特定值的概率是非常低的,不管他的范围有多小。

## #
需要注意的是,switch语句中的break也很关键,它会让程序跳出整个switch语句块。如果没有break,一个case的代码执行完后会继续执行紧接在case后的代码,这也叫贯穿(Fall-through)。

switch语句的贯穿

#include<iostream>
using namespace std;
//使用switch语句打印一位数中文数字

int main()
{
	int num = 6 ;
	switch (num)
	{
		case 0:
			cout << "零" << endl;
			break;
		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;
		case 6: 
			cout << "六" << endl;
		case 7: 
			cout << "七" << endl;
			break;
		case 8: 
			cout << "八" << endl;
			break;
		case 9:
			cout << "九" << endl;
			break;
		default :
			cout << "数字不在0-9之间!" << endl;
			break;
	}
	return 0 ;
}

输出结果:
在这里插入图片描述
从输出结果可以看出,这种情况与期望不一致,代码行为与预期出现了偏差。

switch语句贯穿的合理应用:

#include<iostream>
using namespace std;

//switch语句贯穿的合理应用

int main()
{
	int num = 6 ;
	switch (num)
	{
		case 0:
		case 2:
		case 4:
		case 6:
		case 8:
			cout << "num是偶数!" << endl;
		  break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 9:
			cout << "num是奇数!" << endl;
		  break;
		default :
			cout << "数字不在0-9之间!" << endl;
		  break;
	}

	return 0;
}

运行结果为:
在这里插入图片描述
示例展示了如何利用贯穿的特性使程序变得更灵活,从而实现对一个数奇偶的判断。

此外,default的添加也是值得注意的,因为如果没有把所有可能出现的case都处理好的话,程序可能会出现预期外的行为。

遗漏default:

#include<iostream>
using namespace std;

//遗失default

int main()
{
	int num = 11 ;
	switch (num)
	{
		case 0:
		case 2:
		case 4:
		case 6:
		case 8:
			cout << "num是偶数!" << endl;
		        break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 9:
			cout << "num是奇数!" << endl;
		        break;
	}

	return 0;
}

示例中遗失了default,这样导致了程序在num= 11,的时候,什么都不会打印,用户将感到十分的困惑。

如果本文对你有帮助请点赞支持一下下~

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值