02【手把手教你入门C语言】分支和循环语句

前言

 C语言是一门结构化的程序设计语言,它包括顺序结构、选择结构和循环结构。
 比如一条路从头走到尾就是顺序结构;遇到分叉路口,选择走哪条路就进入了选择结构( if 、 switch 实现);
 当我们重复走一段路就处于循环结构中( for 、 while 、 do while 实现)。 

什么是语句?

#include <stdio.h>
int main()
{
	;//空语句:一个分号就是一条语句
	return 0;
}

空语句一般用在
当我们需要一条语句,但是这个语句不需要执行任何事,就可以写一条空语句。

一、 分支语句(选择结构)

在初识C语言中,我们已经见过选择结构,那么下面让我们一起学习选择结构有哪些语法?以及这些语法是怎么使用的呢?

1. if 语句

1.1 if 条件语句

if 语句的语法结构:

if 语句即为判断语句,当if中的表达式为真时,就执行if后面的语句,如果为假,则不执行。

if(表达式)
    语句;

举个例子:输入一个整数,判断该整数是否为奇数。

在这里插入图片描述

在C语言中,0表示假,非0表示真。上面输入的数字为7, if 后边的表达式 7 % 2 ==1的结果为真,则输出的表达式执行,执行的结果为7是奇数。

1.2 if…else 语句

if语句可以单独使用,也可以与else搭配使用,但else语句无法单独使用。

if与else使用,当if中的条件不成立时,则会执行else语句;如果条件成立,则会执行if语句的内容,不会执行else的内容。

if…else 语句语法结构:

if(表达式)
  语句1else
  语句2;  

举个例子:输入一个整数,判断该整数是奇数还是偶数。

在这里插入图片描述

if…else 练习:输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("成年\n");
	else
		printf("未成年\n");
	return 0;
}

1.3 嵌套 if 语句( if…else if…else语句)

这种语句形式提供了两种以上的判断方式。语句会依次往下匹配if和else if语句中的条件,如果条件成立则会执行相应的语句,当所有条件都不成立时则执行最后的else语句。

if…else if…else语句语法结构:


if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else if(表达式3)
    语句3....
else
    语句n;

举个例子:

在这里插入图片描述
分支中包含多条语句
if 语句默认可控制一条语句,如果if 语句要控制多条语句的时候,需要用{ }把代码括起来,只有一条语句的时候也可以用大括号括起来,我们也称一对{ }为代码块。

1.4 if 语句中的常见问题

1.4.1 if判断条件后面不能加分号(;)

当if判断条件后面以后加入分号(;),if的判断条件将成为一句单独的语句,与下面的执行语句没有任何关系,也就是说,无论if中的判断条件成不成立,都会执行if下面的语句。

看看下面的代码:

#include <stdio.h>
int main()
{
	int age = 17;
	if (age > 18);
	printf("成年");

	return 0;

}

在这里插入图片描述
很显然age = 17不满足if后面 age > 18的判断条件,但依然执行printf语句。

1.4.2 if执行的语句不加大括号{}

当if后面要执行的语句不加大括号时,默认if只与最近的那一条语句匹配。

看看下面的代码:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("成年了\n");
	    printf("可以谈恋爱了\n");
	return 0;
}

(1)键盘输入10,执行结果为“可以谈恋爱了”
输入10

(2)键盘输入20,执行结果为“成年了 可以谈恋爱了”

在这里插入图片描述

由此可知,该程序中 printf(“可以谈恋爱了\n”); 这条语句与if语句并没有关系,if里的条件无论成不成立都会执行这条语句。

(3)我们要if语句同时控制2条语句,就要使⽤ {} 将代码括起来。

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("成年了\n");
 printf("可以谈恋爱了\n");
 }
 return 0;
}

在这里插入图片描述

1.4.3 if语句中悬空else的匹配问题

(1)思考下面代码的执行结果是什么?

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
	else
			printf("haha\n");
	return 0;
}

结果是:什么也不输出。

  • 像这种else不明确与哪个if匹配的情况,我们称之为悬空 else 问题。
  • 从图中的对齐情况上看,else应该是与第一个if匹配,但是当我们把这段代码输入VS2019时,会发现else自动与if对齐。
  • 由此我们可以得出,在C语言中,else默认与离它最近的if匹配。所以上面这段代码的运行结果是不输出任何东西。

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

(2)如果我们给if (表达式)后面添加上{},可以使得代码可读性更高。

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}
	return 0;//什么也不输出:else是和第二个if进行匹配的
}

2. switch 语句

switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。

2.1 switch 语句语法结构

switch(整型或字符型表达式) 
{
case 整形或字符型常量表达式1:
     语句1case 整形或字符型常量表达式2:
     语句2... ...
default//default这条语句可以不加,相当于if语句中的else
     上述所有条件都不成立时执行的语句
}

举个例子:输⼊一个1~7的数字,打印对应的星期几
在这里插入图片描述

  • 即switch后面的( )中的day 的值等于case后面的值时,执行对应的语句。

2.2 brea关键字在switch语句中的作用

(1)在VS2019中执行下面的代码,键盘输入5,执行结果为什么不是星期五?

在这里插入图片描述

  • 如上图,代码输出了我们想要的星期5,但是把后面的星期6和星期天也一并输出了,说明当我们输入5之后,程序从case 5 进入语句执行,但是执行完case 5 的语句后并没有停止,而是一直往后执行直到switch语句结束。

(2)如果我们只想要其中某一个分支的结果,应该在每个case语句分支后加上break;

运行程序,键盘输入4,则执行结果为星期四,因为每个case语句都有break,所以并没有执行后面的case5、case6、case7。

在这里插入图片描述

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

  • 在 switch 语句中使用 break 才能在跳出 switch 语句。
  • 如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执行,有可能执⾏其他 case
    语句中的代码,直到遇到 break 语句或者 switch 语句结束。

(3)灵活运用break

  switch语句练习:键盘输入1-5时,程序都输出工作日,而输入6-7时输出休息日。

在这里插入图片描述

2.3 switch语句中的default子句

当 switch 后的表达式中的值无法满足我们给出的所有情况时,虽然程序并不会终止,也不会报错。但是如果我们不想忽略这些case标签之外的值,我们可以用switch语句中加入default子句。

在这里插入图片描述

  • 在 switch 语句中 case 语句和 default 语句是没有顺序要求的,不过我们通常是把 default ⼦句放在最后处理的。
  • 一个switch语句中只能有一条default子句。
  • 进入default语句之后也可以不执行任何语句,直接break跳出分支。

二、循环语句

1. while 语句

当while中的表达式为真时,执行循环语句,然后再次判断表达式是否为真,为真则继续执行循环语句,如此反复,直到表达式为假则跳出循环语句。

1.1 while 语句语法结构

while(表达式)
 循环语句;

看看下面的代码:
在这里插入图片描述
因为while后面的1恒为真,所以执行结果为死循环的打印hehe。

while循环:实现打印数字1-10。

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

在这里插入图片描述

这个代码通过i=i+1这一条语句来改变i的值,使i为11时不符合while循环的条件,从而跳出循环。

1.2 while循环中break的作用

break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述

打印了1,2,3,4后,当i等于5的时候,循环在 break 的地⽅终⽌,不再打印,不再循环。

1.3 while循环中continue的作用

continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏下⼀次循环的判断。

(1) continue 可以跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}

59.png)

当i为5时,遇到continue,会直接跳过continue后面的语句,直接来到 i <= 10的判断部分 ,此时i仍然为5,因此会一直执行打印的操作。

(2)修改上面的代码,调整 i++的位置 :

#include <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		i++;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述

当i为5时,遇到continue,程序直接跳转到while语句中的判断部分,并没有执行后面的打印语句,所以执行结果没有5。

2. for 语句

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

2.1 for循环语句语法结构

for(表达式1;表达式2;表达式3)
 循环语句;
 //表达式1 ⽤于循环变量的初始化
//表达式2 ⽤于循环结束条件的判断
//表达式3 ⽤于循环变量的调整

for循环实现:在屏幕上打印1~10的值

#include <stdio.h>
int main()
{
 int i = 0;
 for(i=1; i<=10; i++)
 {
 printf("%d ", i);
 }
 
 return 0;
}

在这里插入图片描述

我们可以将for循环和while循环进行对比,比如相同的打印数字1-10的程序:

#include <stdio.h>
int main()
{
 int i = 0;
 //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
 for(i=1; i<=10; i++)
 {
 printf("%d ", i);
 }
 return 0; 
 }

#include <stdio.h>
int main()
{
	int i = 1;//初始化
	while (i <= 10)//判断
	{
		printf("%d ", i);
		i = i + 1;//调整
	}
	return 0;

}

可以看出for循环更加简洁明了一些,循环条件更集中,更方便我们查找和理解。

2.2 for循环中的break和continue

(1)for循环中的break和while循环中的break 作用皆为终止循环,在此不再做说明。
(2)for循环语句中的continue与while循环中的不同。

while循环中的continue是让程序跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断。如果循环的调整是在 continue 后边的话,可能会造成死循环。

for循环中的continue则是跳过本次循环中continue 后的代码,直接去到循环的调整部分。

(1)for循环中的break:与while循环中的break 作用皆为终止循环

#include <stdio.h>
int main()
{
 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 break;
 printf("%d ", i);
 }
 return 0;
}

在这里插入图片描述

(2)for循环中的continue

#include <stdio.h>
int main()
{
 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
 printf("%d ", i);
 }
 return 0;
}

在这里插入图片描述
程序并没有死循环,而是在i为5时跳过打印,直接跳转到i++的部分。

3. do…while 语句

while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。

3.1 do…while 语句语法结构

do
 语句;
while(表达式)

do…while 实现在屏幕上打印1~10的值:

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);

	return 0;
}

在这里插入图片描述

3.2 do…while 语句中的break和continue

do…while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,下面上代码。

do…while 语句中的 break :

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);

	return 0;
}

在这里插入图片描述

do…while 语句中的 continue :

#include <stdio.h>
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);

	return 0;
}

在这里插入图片描述

4. 循环的嵌套

前⾯学习了三种循环 while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决
问题,就是我们所说的:循环嵌套,这⾥我们就看⼀个例⼦。

找出100~200之间的素数,并打印在屏幕上。

#include <stdio.h>
int main()
{
	int i = 0;
	//循环产生100~200的数字
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//循环产生2~i-1之间的数字
		int j = 0;
		int flag = 1;//假设i是素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述

三、 goto 语句

goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。

1. goto语句语法结构

goto 标记位置的名称;
... ...
标记位置的名称:
   其他语句

看看下面的代码:

#include <stdio.h>
int main()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");

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

在这里插入图片描述

2. goto语句使用场景

goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。

for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
error:
//...
 

本来 for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使⽤3个 break 才能跳出循环,所以在这种情况下使⽤ goto 语句就会更加的快捷。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值