4.选择结构(if语句、switch语句、关系运算符、逻辑运算符)

C语言支持三种结构
1.顺序结构
2.选择结构
3.循环结构

C语言主要用if、switch语句实现分支结构

1.if语句

1.1 if
格式:

if(条件表达式){
    
    
	语句
}

如果条件表达式成立(真),执行语句;如果不成立(假),则不执行语句
本质:在C语言中0为假,非0为真,即条件表达式为非0,则执行语句;若为0则不执行语句

例:判断一个数是否为正数,是正数的话打印"其是正数"

int main() {
    
    
	int num = 0;
	scanf("%d", &num);
	if (num>0)
	{
    
    
		printf("%d是正数",num);
	}
	return 0;
}

在这里插入图片描述



注意:这里if语句在没有{}的情况下只能默认控制往下第一条语句,所以建议使用大括号{}将其包括起来

int main() {
    
    
	int num = 0;
	scanf("%d", &num);
	if (num>0)
		printf("%d是正数\n",num);
		printf("%d是个数", num);//没有{}包括 所以不受if语句影响
	return 0;
}

因为if只控制下面一条语句,所以无论num是否大于0第二行的内容都会打印
在这里插入图片描述
同样else同理,没有大括号{}包括也只影响往下一条语句


1.2 else
格式:

if(条件表达式){
    
    
	语句1
}else{
    
    
	语句2
}

如果条件表达式成立(真),则执行语句1
如果条件表达式不成立(假),则执行语句2

例:判断一个数是否为正数,是正数的话打印"其是正数",否则打印”其非正数“

int main() {
    
    
	int num = 0;
	scanf("%d", &num);
	if (num>0)
	{
    
    
		printf("%d是正数",num);
	}
	else
	{
    
    
		printf("%d是非正数", num);
	}
	return 0;
}

1.3 嵌套if(else if)
格式:

if(条件表达式1){
    
    
	语句1
}else if(条件表达式2){
    
    
	语句2
}else{
    
    
	语句3
}

如果条件表达式1成立(真),则执行语句1;
如果条件表达式1不成立(假),则对条件表达式2进行判断,若条件表达式2成立(真),则执行语句2;否则执行语句3

其实就相当于在else语句里面又重新添加了一对if…else…语句

输⼊⼀个⼈的年龄 如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中老年"
如果年龄在60岁⾄89岁打印"老年"
如果90岁及以上打印"老寿星"

int main() {
    
    
	int age = 0;
	scanf("%d", &age);
	if (age < 18 && age >= 0) {
    
    
		printf("少年");
	}
	else if (age <= 44)
	{
    
    
		printf("青年");
	}
	else if (age <= 59)
	{
    
    
		printf("中老年");
	}
	else if (age <= 89)
	{
    
    
		printf("老年");
	}
	else if(age >= 90)
	{
    
    
		printf("老寿星");
	}
	else
	{
    
    
		printf("报错!");
	}
	return 0;
}

1.4 悬空else问题

	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("11111\n");
	else
		printf("22222\n");
	return 0;

这段代码输出的内容是哪个?我猜大部分人会选择22222
事实上,这段代码啥也没有输出

记住一条规则,没有{}的情况下,else跟最近的if进行匹配


我们把{}加上为其分块,这样就很明了了

	int a = 0;
	int b = 2;
	if (a == 1) 
	{
    
    
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}
	return 0;

若希望第一行的else和else能够匹配,适当的加上{},就会使代码的逻辑结构变得更加清晰,代码的可读性也会变得更高

	int a = 0;
	int b = 2;
	if (a == 1)
	{
    
    
		if (b == 2)
			printf("hehe\n");
	}
	else
	{
    
    
		printf("haha\n");
	}
	return 0;

2.关系运算符

C语言中用于比较的表达式,称为 关系表达式
关系表达式中使用到的运算符,称为 关系运算符
0为假
非0为真
在这里插入图片描述
注意事项:

注意点1:关系运算符== 和 赋值= 是完全不同的两种符号且意义也完全不同
a==1 是拿变量a与1作比较,若成立则为非0;否则为0
a = 1 是将1这个值赋值给变量a

注意点2:多个关系运算符不宜直接连用
比如 a < b < c,虽然这是合法的表达式,但是其有时并非表达为我们想要的意思
原因:C语言中关系表达式是从左至右计算的
a < b < c 我们的角度 想表达 b大于a且小于c
(a<b) < c 编译器的角度 先得出关系表达式a<b的结果x,再得出x<c关系表达式的结果
关系表达式(a<b)的结果只有0或非0,(然后0或非0)小于c做比较,所以表达的意思完全不同

例:年龄大于等于18岁,小于等于36岁,则输出青年

int age = 0;
scanf("%d", &age);
if(18<=age<=36)
{
    
    
printf("⻘年\n");
}
return 0;

上述代码,此时输入12,编译器先比较18<=12,不成立,返回0;再0<=36,成立,返回非0,执行if内的语句
但是与我们实际需要表达的意思是不一致的。


int age = 0;
scanf("%d", &age);
if(18<=age && age<=36)
{
    
    
printf("⻘年\n");
}
return 0;

此时应该添加逻辑运算符中的与运算符(&&),就能使其正确的表达我们的意思

3.逻辑运算符

逻辑运算符提供逻辑判断功能,主要有以下三个运算符
在这里插入图片描述

3.1 逻辑取反运算符(!)

	int a = 0;//条件表达式中0为假
	if (!a)
	{
    
    
		printf("true");
	}
	else 
	{
    
    
		printf("false");
	}
	return 0;

结果:true

3.2 逻辑与运算符(&&)

	int a = 0;
	int b = 1;
	if (a && b)// 0 && 1 结果为 0
	{
    
    
		printf("true");
	}
	else
	{
    
    
		printf("false");
	}
	return 0;

结果:false

3.3 逻辑或运算符(||)

	int a = 0;
	int b = 1;
	if (a || b)// 0 || 1 结果为 0
	{
    
    
		printf("true");
	}
	else
	{
    
    
		printf("false");
	}
	return 0;

结果:true

3.4 练习:闰年的判断

输入一个年份year,判断其是否为闰年
闰年:
1.能被4整除且不能被100整除是闰年
2.能被400整除是闰年

//代码1
int main()
{
    
    
	int year = 0;
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0){
    
    
		printf("%d是闰年\n",year); 
	}
	else if (year % 400 == 0) {
    
    
		printf("%d是闰年\n", year);
	}
	return 0;
}
//代码2
int main()
{
    
    
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("%d是闰年\n", year);
	return 0;
}

3.5 短路

C语言逻辑运算符的一个特点,上面说到关系运算符的计算顺序是从左至右,逻辑表达运算符也是如此,即==逻辑表达式中,判断逻辑的顺序从左至右==。
若逻辑表达式中 左边的逻辑表达式若是满足逻辑运算符对应的条件,则不会再判断右边的逻辑表达式,俗称’短路"

短路条件
逻辑与运算符

int month = 2;
if(month >= 3 && month <= 5){
    
    //左边0 即 不成立
	printf("短路,右边不需要执行")
}

与运算符(&&)
若左边表达式结果为0,不成立,右边表达式不需要执行

逻辑或运算符

int month = 2;
if(month >= 1 || month <= 0){
    
    //左边非0 即 成立
	printf("未短路,右边需要执行")
}

或运算符(||)
若左边表达式结果为非0,成立,右边表达式不需要执行

4.switch语句

4.1 switch

switch语句是一种特殊的if…else…结构,用于判断有多个结果的情况

格式:

switch(条件表达式){
    
    //结果必须为整型
	case value0:
		语句0;
		break;
	case value1:
		语句1;
		break;
	case value2:
		语句1;
		break;
	default:
		语句d;
		break;
}

=注:
1.条件表达式一定为整型表达式
2.case value中value必须为整型常量,case后面有个空格



输入1-5,打印周一至周五
输入6-7,打印休息日

int main() {
    
    
	int weekday = 0;
	scanf("%d", &weekday);
	switch (weekday){
    
    
		case 1:
		{
    
    
			printf("星期一");
			break;
		}
		case 2:
		{
    
    
			printf("星期二");
			break;
		}
		case 3:
		{
    
    
			printf("星期三");
			break;
		}
		case 4:
		{
    
    
			printf("星期四");
			break;
		}
		case 5:
		{
    
    
			printf("星期五");
			break;
		}
		default:
		{
    
    
			printf("休息日");
			break;
		}
	}
	return 0;
}

4.2 break

break意义为终止的意思,每一个case语句执行完之后,需要加上break才能跳出switch语句
否则,将会继续执行下面的case语句,直至遇到break或者switch语句执行完毕为止

int main() {
    
    
	int weekday = 0;
	scanf("%d", &weekday);
	switch (weekday){
    
    
		case 1:
			printf("星期一");
		case 2:
			printf("星期二");
		case 3:
			printf("星期三");
		case 4:
			printf("星期四");
		case 5:
			printf("星期五");
			break;
		}
		default:
		{
    
    
			printf("休息日");
			break;
		}
	}
	return 0;
}

上述代码1-4都没有break,直至5才有break
所以输入1后,会一将下面的case 2-4的语句全部执行,直至遇到case 5语句中的break才结束程序。

在这里插入图片描述



例:
输入1-5,输出工作日
输入6-7,输出休息日

	int weekday = 0;
	scanf("%d", &weekday);
	switch (weekday){
    
    
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		{
    
    
			printf("星期五");
			break;
		}
		case 6:
		case 7:
		{
    
    
			printf("休息日");
			break;
		}
	}

可以将case像这样合并起来堆叠使用


4.3 default

int main() {
    
    
	int weekday = 0;
	scanf("%d", &weekday);
	switch (weekday){
    
    
		case 1:
		{
    
    
			printf("星期一");
			break;
		}
		case 2:
		{
    
    
			printf("星期二");
			break;
		}
		case 3:
		{
    
    
			printf("星期三");
			break;
		}
		case 4:
		{
    
    
			printf("星期四");
			break;
		}
		case 5:
		{
    
    
			printf("星期五");
			break;
		}
		default:
		{
    
    
			printf("休息日");
			break;
		}
	}
	return 0;
}

switch后面的条件表达式得出的值无法匹配所有的case语句,则执行default子句
deafult即默认的意思
即:输入除1-5数字以外的数字,结果均为休息日

猜你喜欢

转载自blog.csdn.net/qq_45657848/article/details/131885211