C语言之旅4-(有很多细节!!!)-分支与循环【1】

8 篇文章 0 订阅
8 篇文章 0 订阅

if语句

前面,我们讲过C语言是结构化程序语言,支持三种结构顺序,选择,循环)。C语言中规定了很多语法去实现这三种结构。if语句就是选择结构的组成一员。

  • if语句的格式:
if (表达式)
	语句;
//又或者
if (表达式)
{
		语句1;
		语句2;
		.
		.
		.
		语句n;
}
  • if语句的判断逻辑:在这里插入图片描述

  • if语句的结构:英文单词if:如果if里面的表达式成立(为真)时,它就执行下面的语句,反之当不成立时(为假),它就不执行下面的语句。前面,咱们讲过,C语言中0为假,非0为真。 if控制的语句是有范围的,每个if语句只能控制一条语句,如代码所示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	if (5 < 6)			//条件成立
		printf("hhhhh"); //成功打印
	return 0;
}

结果运行图:在这里插入图片描述
我们讲了if的表达式条件成立就执行程序,反之不成立就不执行,也就是0为假,非0即真,我在里面放入非0的数字它也可以执行,如代码所示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
     if (5)
		printf("hhhhh"); //打印信息
	if (0)
		printf("hhhhh"); //不打印信息
	return 0;
}

结果运行图:在这里插入图片描述

  • else的介绍: 单词意思:别的,其它的。就是if语句的另一个情况补充,就是当if语句的情况不成立时,再过来判断else的情况,即if...else...格式它俩是两种独立的情况,也就是说只有一个情况会实现,所以if...else...就是一条语句else的结构和对语句的控制范围和if一样。进行代码展示:
写一个程序,输入一个正整数,判断它是不是偶数,如果是,就显示偶数,否则就显示奇数。
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 2 == 0)
		printf("a是偶数");
	else
		printf("a是奇数");
	return 0;
}

结果运行图:在这里插入图片描述
在这里插入图片描述

  • if...else if...else...的介绍: 这种语法又拓展了if语句的情况。格式如下:
if (表达式)
	语句;
else if (表达式)
	语句;
	.			//之间可有多个 if else 语句
	.
	.
else
	语句;

其实这个语句本质上就是if语句的嵌套,我们先写个程序:

// 写一个程序,当我们输入一整数时,先判断它是否为正数,再然后判断奇偶性。人。
//第一种程序的写法:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
		int a = 0;
		scanf("%d", &a);
		if (a<0)
			printf("a是负数");
		else
		{
			if(a%2==0)
			   printf("a是偶数");
			else
				printf("a是奇数");
		}
	  return 0;
}

// 第二种程序的写法:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
		int a = 0;
		scanf("%d", &a);
		if (a<0)
			printf("a是负数");
		else if(a%2==0)
			   printf("a是偶数");
		else
			printf("a是奇数");
	  return 0;
}

结果运行对比图:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过对比图,各位就能很好理解它们就是嵌套的意思了吧。

  • 注意else在C语言中,有个默认的规定——当else遇到多个if语句的时候,它会与最近的if语句组合。 如代码所示(可以猜一下输出的结果):
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
		int a = 0;
		int b = 10;
		if (a<0)
			if(b==10)
			 printf("hhhh");
		else
			 printf("aaaaa");
	  return 0;
}

结果运行图:在这里插入图片描述
表面上应该打印的信息是"aaaaaa",但结果却不是,就是因为当else遇到多个if语句的时候,它会就近原则。因为当if (a<0)不成立时,后面所有的语句都不执行,这里的if (b==10)....else...。就是一条语句(上面我们讲了),所以它属于if (a<0)的控制范围内,所以它不成立,后面就不执行了。

关系操作符

C语言中用于比较关系的表达式叫做:关系表达式。其中参与运算的操作符叫做:关系操作符。常见的关系操作符如下所示:

>  大于
<  小于
>=   大于等于
<=	小于等于
= =	相等
!=	不等于

进行简单的举例子:

a	>	b;
a	<	b;
a	>=	b;
a	<=	b;
a	==	b;
a	!=	b;

对于关系操作符来讲,它是有返回值的。当表达式成立就返回1(非0为真),表达式不成立就返回0(0为假),进行代码展示;

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 4;
	int c = (a > b);
	int d = (a < b);
	printf("%d\n", c);		//条件为真,返回1
	printf("%d\n", d);		//条件为假,返回0
	  return 0;
}

结果运行图:在这里插入图片描述
关系操作符不适合连用,即 a < b< c。关系操作符连用时,会从左向右依次运算,首先a和b进行比较,比较的结果为0或1(因为有返回值),然后会拿返回值继续与b进行运算。这就会导致最终的结果与我们的预期不符。进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 4;
	int c = 9;
	if(a>b>c)					//a>b成立,返回1.返回值1继续与9比较,1小于9,不成立
		printf("%d\n", c);		//所以不执行本语句
	  return 0;
}

结果运行图:在这里插入图片描述

条件操作符

这个条件操作符也叫三目操作符,比较冷门(它可以被某些程序块所替代)。直接给大家上格式(表达式1 ? 表达式2 :表达式3):

表达式1 ? 表达式2 :表达式3 

// 咱们先写个普通程序(不用条件操作符)
//	程序1
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
		int a = 10;
		int b = 4;
		int c = 0;
		if (a > b)
		{
			c = 6;
			printf("%d\n", c);
		}
		else
		{
			c = 8;
			printf("%d\n", c);
		}
	  return 0;
}
//程序2
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 4;
	int c = a < b ? a : b;		//int c = (a < b ? a : b);	这样写也OK
	printf("%d\n", c);
	  return 0;
}

运行结果图:在这里插入图片描述
在这里插入图片描述

  • 对条件操作符的运算解读(表达式1 ? 表达式2 :表达式3:表达式1成立,就执行表达式2,否则就执行表达式3。

逻辑操作符:&&,||,!

逻辑操作符是针对于表达式而言的

  • &&逻辑与操作符:&&逻辑与具有并且的作用,就是当两个条件都成立时(两个都为真,最终结果才为真),整体才成立。但是,有一个条件不成立时(有一个条件为假,最终结果就为假),整体就不成立。如图,逻辑关系图所示:在这里插入图片描述
    在前面,我们讲过关系操作符不宜连用。比如,a < b < c。这个时候,我们可以用逻辑与操作符进行修改,比如,a < b && b < c。进行代码展示:
// 写一个程序,判断0~10岁为少年,11~25岁为青年,26~45岁为壮年,46~60为中年,61~100岁为老年。
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0 && a <= 10)
		printf("少年");
	else if(a>=11&&a<=25)
		printf("青年");
	else if (a>=26&&a<=45)
		printf("壮年");
	else if (a>=46&&a<=60)
		printf("中年");
	else 
		printf("老年");

	return 0;
}

结果运行图:在这里插入图片描述
在这里插入图片描述
&&就很好的规避了关系操作符不宜连用的问题,而且逻辑清晰,代码格式美观,可读性很高。

  • ||逻辑或操作符:
    ||逻辑或操作符的逻辑与&&相反当两个表达式的结果都为假时,整体的结果才为假。有一个表达式的结果为真,整体结果就为真。如图,逻辑关系图所示:在这里插入图片描述
    接下来,我们写一个程序:
//	我们写一个判断闰年和平年的程序,当我们输入年份,能够自动判断平年和闰年。
//闰年:能被4整除且不能被100整除,或者能被400整除。
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0))
		printf("闰年");
	else
		printf("平年");
	return 0;
}

运行结果图:在这里插入图片描述
在这里插入图片描述

  • !逻辑取反操作符:
    这玩意儿就跟变魔术似的,假变为真,真变为假。比如,表达式1不成立,导致的最终结果为假。我们可以这样! 表达式1不成立==表达式1成立。如图,逻辑关系图:在这里插入图片描述
  • &&和||的短路现象:当我们有多个&&或||时,整体就存在短路现象,它会从左向右依次运算。如代码所示:
int a = 10;
int b = 8;
a < b && a++ && b-- ;		//a < b不成立,就会用返回值0(为假)进行后面的运算。
				//咱们讲过,&&一假,就全为假,所以有一个为假,就整体为假,后面就不用看了。
				//只有第一个条件为真,才向后继续判断。
				
a > b || a++ || b-- ;	//a > b 成立,就会用返回值1(为真)进行后面的运算。
				//咱们讲过,||一真,就全为真,所以有一个为真,就整体为真,后面就不用看了。
				//只有第一个条件为假,才向后继续判断。

大家猜一下,下面的运算结果:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
		int i = 0, a = 0, b = 2, c = 3, d = 4;
		i = a++ && ++b && d++;
		//i = a++||++b||d++;           大家可以自行试试这个||的运算结果
		printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	
	return 0;
}

运行结果图:在这里插入图片描述
不知道你猜对了没有!!!

switch语句

switch语句和if语句一样,也是选择结构中的一种语法。 结构如下:

switch (表达式)
{
		case 常量值1:	语句 1;
		case 常量值2:	语句 2;
		.
		.
		.
		case 常量值n;	语句 n;
		default :	语句 ;
}

switch语句就是if...else...语句的另一种形式根据表达式的结果,来进行判断符合哪一个语句,如果都不符合的话,就执行default语句。进行代码展示;

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
		case 1:
			printf("hhhh\n");
		case 2:
			printf("aaaa\n");
	}
	return 0;
}

结果运行图:在这里插入图片描述
前面,我们见过了switch语句得到原理。按理讲,我们输入1,就会执行case 1的语句,输入2,就会执行case 2。为什么会出现这样的结果呢?原因就是我们少了一个break(打破),它是一个关键字具有终止(打破)程序的作用,没有它的话,程序就会继续执行剩下的case语句。进行代码修改:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
		case 1:
			printf("hhhh\n");
			break;
		case 2:
			printf("aaaa\n");
			break;
	}
	return 0;
}

结果运行图:在这里插入图片描述
在这里插入图片描述
在这里我是想说,break不是一定要用(并不是有case就要有break),要根据具体的程序来使用。 我们来写个程序:

// 当我们输入1~5表示工作日,6~7表示休息日。

//	程序	1
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{	
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
		case 1:
			printf("工作日");
			break;
		case 2:
			printf("工作日");
			break;
		case 3:
			printf("工作日");
			break;
		case 4:
			printf("工作日");
			break;
		case 5:
			printf("工作日");
			break;
		case 6:
			printf("休息日");
			break;
		case 7:
			printf("休息日");
			break;
	}
	return 0;
}

//程序 2
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{	
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("工作日");
			break;
		case 6:
		case 7:
			printf("休息日");
			break;
	}
	return 0;
}

结果运行图:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
default语句也不是必须品,也是要根据具体程序来用的,它不一定要放后面,放前面也是OK的。进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	  default:
		printf("请输入1~7的数字");
		break;
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("工作日");
			break;
		case 6:
		case 7:
			printf("休息日");
			break;
	}
	return 0;
}

结果运行图:在这里插入图片描述
对于switch语句的使用是很灵活的,大家不要被模板公式所禁锢!!!case后面不一定要加break,default也不是必须的,也不一定要放末尾

来个彩蛋放松一下!!!

https://www.bilibili.com/video/BV1jAigeuEm3/?spm_id_from=333.788.recommend_more_video.1&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
在这里插入图片描述
每章一句“人因梦想而伟大,因坚持梦想而成长”,感谢你能看到这里,点赞+关注+收藏是对我最大的鼓励,咱们下期见!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值