基本魔法语言分支和循环 (二) (C语言)


🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!

🔭个人主页: 散峰而望

🚀学习方向: C/C++等方向

📌专栏系列:

💬人生格言: 冀以尘雾之微,补益山海,荧烛末光,增辉岁月。

🎬博主简介

文章目录

  • [5. switch语句](#5. switch语句)
    • [5.1 if语句和switch语句的对比](#5.1 if语句和switch语句的对比)
    • [5.2 switch语句中的break](#5.2 switch语句中的break)
    • [5.4 switch语句中的case和default的顺序问题](#5.4 switch语句中的case和default的顺序问题)
  • [6. while循环](#6. while循环)
    • [6.1 if和while的对比](#6.1 if和while的对比)
    • [6.2 while语句的执行流程](#6.2 while语句的执行流程)
  • 7.for循环
    • [7.1 语法形式](#7.1 语法形式)
    • [7.2 for循环的执行流程](#7.2 for循环的执行流程)
    • [7.3 for循环的实践](#7.3 for循环的实践)
    • [7.4 while循环和for循环的对比](#7.4 while循环和for循环的对比)
  • [8. do-while循环](#8. do-while循环)
    • [8.1 语法形式](#8.1 语法形式)
    • [8.2 do-while循环的执行流程](#8.2 do-while循环的执行流程)
    • [8.3 do-while的实例](#8.3 do-while的实例)
  • [9. break和continue语句](#9. break和continue语句)
    • [9.1 while循环中的break和continue](#9.1 while循环中的break和continue)
      • [9.1.1 break举例](#9.1.1 break举例)
      • [9.2.2 continue举例](#9.2.2 continue举例)
    • [9.2 for循环中的break和continue](#9.2 for循环中的break和continue)
      • [9.2.1 break举例](#9.2.1 break举例)
      • [9.2.2 continue举例](#9.2.2 continue举例)
    • [9.3 do-while中的break和continue](#9.3 do-while中的break和continue)
  • [10. 循环的嵌套](#10. 循环的嵌套)
  • [11. goto语句](#11. goto语句)
  • 结尾

5. switch语句

switch语句相当于多重命运咒 ,是一个决策性咒语,用于在多种已知的可能性中选择一条路径。相当于是一种特殊形式的if...else 结构,把多重的if...else改成更易用、可读性更好的形式。下面是switch的语言基本模板。

c 复制代码
switch(expression)
{
case value1:statement
case value1:statement
...
default:statement
}

上面代码中,根据expression不同的值,执行相应的case分支。如果找不到相应的值,就执行default分支。

注意:

  • switch后面的expression必须是整型表达式
  • case后面的值,必须是整形常量表达式

5.1 if语句和switch语句的对比

如:输入任意整数值,计算除3之后的余数

如果用if语句

c 复制代码
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("整除,余数为0\n");
	else if (n % 3 == 1)
		printf("余数为1\n");
	else
		printf("余数为2\n");
	return 0;
}

如果用switch语句改写,是这样的

c 复制代码
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	case 1:
		printf("余数为1\n");
		break;
	case 2:
		printf("余数为2\n");
		break;
	}

}

上述的代码中,我们需要注意的点:

  • case和后边的数字之间必须有空格。
  • 每一个case语句中的代码执行完成后,需要加上break,才能跳出这个switch语句。

5.2 switch语句中的break

break相当于咒语结界符 ,当你执行一道正确的多重命运咒 魔法,这个结界会立即将你传送出整个多重命运咒,防止你继续执行后面并行魔法咒语。如果上面的代码中除去break,会出现什么情况?

c 复制代码
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
	case 1:
		printf("余数为1\n");
	case 2:
		printf("余数为2\n");
	}

}

我们发现,3除以3本来余数是0,但是我们发现程序运行的结果多了两行"余数为1"和"余数为2"的打印。

这是为什么呢?

原因是switch语句是分支效果的,只有在switch语句中使用break才能跳出switch语句,如果某一个case语句的后面没有break语句,代码会继续执行下去,有可能执行其他case语句中的代码,直到遇到break语句或switch语句结束,就如上图。

所以在switch语句中break语句是非常重要的,能实现真正的分支效果。

当然,break也不是每个case语句都要有,这要根据实际情况来看。如输入1~5输出"工作日", 6~7输出"休息日":

c 复制代码
int main()
{
	int day = 0;
	scanf("%d\n", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

5.4 switch语句中的case和default的顺序问题

在switch语句中case语句和default子句有顺序吗?default只能放在最后吗?

自然不是,放哪都行,不过通常将default放在最后处理。

6. while循环

while是一个条件持续咒语 ,只要魔力足够强(条件为真),就会执行咒语(循环体)。只要魔力足够,咒语就会一直执行。如此反复,直到魔力耗尽(条件为假),咒语自动解除。是一个先判断 ,后执行的咒语,如果一开始魔力就已经耗尽,那么咒语一次都不会生效。

同时while语句的语法结构和if非常相似。

6.1 if和while的对比

c 复制代码
if(表达式)
  语句;

while(表达式)
  语句;//如果想包含更多的语句,可以加大括号

当然可以用具体的代码对比一下:

c 复制代码
int main()
{
	if (1)
		printf("Welcome to China\n");
	return 0;
}
c 复制代码
int main()
{
	while (1)
		printf("Welcome to China\n");
	return 0;
}

可以看到if和while的区别,while语句是可以实现循环效果,一直重复下去。

6.2 while语句的执行流程

首先上来就是执行判断表达式,表达式为0,循环直接结束;表达式的值不为0,执行循环语句,语句执行完继续判断,是否进行下一次判断。

7.for循环

for循环是一个精密炼成阵,需要一个固定的"仪式三部曲",是三种循环使用最多的循环。

7.1 语法形式

for循环的语法形式如下:

c 复制代码
for(表达式1;表达式2;表达式3;)
   语句;//如果想包含更多的语句,可以加上大括号

仪式三部曲:

1.仪式准备(表达式1):需要一个计数器并赋予初始值(int i = 0)

2.仪式条件(表达式2):设定仪式持续的结界(i < 10)

3.仪式步骤(表达式3):每完成一次小仪式,计数器就按预定规律变化(i++)

7.2 for循环的执行流程

首先执行表达式1初始化循环变量,接下来执行表达式2的判断部分,表达式2结果如果== 0,则循环结束;表达式2的结果如果!= 0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。

整个循环过程中,表达式1初始化部分只执行1次,循环的是表达式2、循环语句、表达式3在循环。

7.3 for循环的实践

如在屏幕上打印1~10的值

c 复制代码
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
		printf("%d ", i);
	return 0;
}

7.4 while循环和for循环的对比


for和while在实现循环的过程中都有初始化、判断、调整三个部分,但是for循环的三个部分非常集中,便于代码的维护,如果代码较多的时候,while循环的三个部分比较分散,所以形式上for循环更优一些。

8. do-while循环

do-while相当于无悔誓约咒 ,与while咒语不同,先不顾一切地执行一次咒语效果(循环体),然后才去感知魔力(条件表达式)。如果魔力依然充沛,就重新执行咒语,否则咒语结束。

8.1 语法形式

在循环语句中do-while语句使用的最少,语法如下:

c 复制代码
do
  语句;
while(表达式);  

while和for这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;

而do-while循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会执行下一次,表达式为假,则不再继续循环。

8.2 do-while循环的执行流程

在do-while循环中先执行图上的"语句",执行完语句,在去执行"判断表达式",判断表达式的结果是!= 0,则继续循环,执行循环语句;判断表达式的结果== 0,则循环结束。

所以在do-while语句中循环体是至少执行一次的,这是do-while循环比较特殊的地方

注意:do-while里面创建的变量,while是无法使用的。

8.3 do-while的实例

在屏幕上打印1~9的值

c 复制代码
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i < 10);
	return 0;
}

一般do-while使用在循环体至少被执行一次的场景下,所以比较少。

9. break和continue语句

循环过程中,如果发生某些状况,需要提前终止循环,在C语言中提供了break和continue两个关键字,就是运用到循环中。

  • break的作用是用于永远的终止循环,只要break被执行,直接就会跳出循环,继续执行。
  • continue的作用是跳过本次循环中的continue后边的代码,在for循环和while循环中有所差异。

9.1 while循环中的break和continue

9.1.1 break举例

c 复制代码
int main()
{
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
			break;
		printf("%d", i);
		i = i + 1;
	}
	return 0;
}

打印了01234后,当i == 5时,循环在break地方终止,不再打印,不再循环。

所以break的作用是永久的终止循环,只要break被执行,break外的第一层循环终止。故以后想终止循环,则可以使用break。

9.2.2 continue举例

continue是继续的意思,在循环中的作用就是跳过本次循环中continue后边的代码,继续执行下一次循环的判断。那么break改为continue会是什么结果呢?

c 复制代码
int main()
{
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
			continue;
		printf("%d", i);
		i = i + 1;
	}
	return 0;
}

发现当i == 5时,就执行continue,直接跳过某一次循环continue后边的代码,去循环判断的地方,因为这里跳过i = i + 1,所以i一直为5,陷入死循环,无法结束程序,所以终端只有01234几个数。

9.2 for循环中的break和continue

9.2.1 break举例

与while循环中一样,for循环break也是用于终止循环,不管循环还需要循环多少次,只要执行到break,循环就彻底终止。

c 复制代码
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d", i);
	}
	return 0;
}

break的作用是永久终止循环,故不想继续循环的时候,可以用break实现。

9.2.2 continue举例

如果改为continue会是什么样的呢?

c 复制代码
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d", i);
	}
	return 0;
}

发现for循环中的continue的作用是跳过本次循环,然后接着后面的循环的调整部分,因此打印的其他数都有,唯独没有5。故当某个条件发生时,本次循环无需再执行后续操作时候,可以用continue实现。

9.3 do-while中的break和continue

do-while语句基本上和while循环一模一样,大家可以自行测试体会。

10. 循环的嵌套

前面学习了三种循环while、do-while、for,这三种循环往往会嵌套在形成一个复杂的魔法阵,从而更好的解决问题。这就是所说的:循环嵌套。

举一个例子:找出100~200之间的素数,并打印在屏幕上。

c 复制代码
int main()
{
	int i = 0;
	//循环产生100~200之间的数
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//判断2~i-1之间的数
		int j = 0;
		int flag = 1;//假设i为素数
		//flag作用是为了给一个变量,标记是不是素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}
	return 0;
}

注意:在判断i % j == 0这里不能用if...else...格式来写,比如9不会被2整除,走else判断 flag == 1,但是9不是素数。

c 复制代码
int main()
{
	int i = 0;
	//循环产生100~200之间的数
	for (i = 1; i <= 10; i++)
	{
		//判断i是否为素数
		//判断2~i-1之间的数
		int j = 0;
		int flag = 1;//假设i为素数
		//flag作用是为了给一个变量,标记是不是素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
			else
			{
				flag = 1;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}
	return 0;
}

11. goto语句

C语言提供了一种特殊的语法,就是goto语句和跳转标号,goto语句可以实现同一个函数内跳转到设置好的标号处。

例如:

c 复制代码
int main()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");

next:
	printf("跳过打印haha\n");
	return 0;
}

goto语句不仅可以向前跳,还可以向后跳,但会形成死循环。故goto循环使用不当,就会导致在函数内部随意乱跳,打乱程序的执行流程,所以尽量少用。但在多层循环代码中,想要快速跳转,使用goto非常方便。

结尾

往期回顾

基本魔法语言分支和循环 (一) (C语言)

结语:希望这些能帮助各位快速掌握分支和循环,同时期盼各位佬能给博主来个"一键四连"啦!

相关推荐
前端世界3 小时前
用Python手写一个能识花的感知器模型——Iris分类实战详解
开发语言·python·分类
期待のcode3 小时前
gitee与github远程仓库
gitee·github
草莓工作室3 小时前
mbedtls哈希值计算
c语言·哈希算法·mbedtls
心.c3 小时前
深拷贝浅拷贝
开发语言·前端·javascript·ecmascript
曦樂~4 小时前
【Qt】启动新窗口--C/S传输信息
开发语言·qt
源代码•宸4 小时前
Qt6 学习——一个Qt桌面应用程序
开发语言·c++·经验分享·qt·学习·软件构建·windeployqt
寻找华年的锦瑟4 小时前
Qt-UDP
开发语言·qt·udp
橘颂TA4 小时前
【QSS】软件界面的美工操作——Qt 界面优化
开发语言·qt·c/c++·界面设计
Evand J4 小时前
【MATLAB例程】二维环境定位,GDOP和CRLB的计算,锚点数=4的情况(附代码下载链接)
开发语言·matlab·定位·toa·crlb·gdop