分支与循环语句

文章目录

    • 1.语句的定义
      • 控制语句
    • 2:选择语句(选择结构)
      • 分类
      • 2.1:if语句
        • 语法形式
        • 代码1
        • 代码2
        • 代码3
        • 悬空else(一般匹配离的最近且未进行匹配的if语句)
      • 2.2:switch语句
        • 语法形式
        • 2.2.1:switch语句中的break
          • 代码1
          • 代码2
        • 2.2.2:switch语句中的default子句
          • 定义
          • 代码1
    • 3:循环语句(循环结构)
      • 分类
      • 3.1:while循环
        • 语法形式
        • 代码1
        • 3.1.1:while循环中的break
          • 代码2
        • 3.1.2:while循环中的continue
          • 代码3
        • while循环的流程图
        • 总结
      • 3.2:for循环
        • 语法形式
        • 代码1
        • 代码2
        • 3.2.1:for循环中的break
          • 代码3
        • 3.2.2:for循环中的continue
          • 代码4
        • 3.2.3:for循环中的变种
          • 代码5
          • 代码6
          • 代码7
        • for循环的流程图
        • 总结
      • 3.4:do...while循环
        • 语法形式
        • 代码8
        • 3.4.1:do....while循环中的break
          • 代码9
        • 3.4.2:do....while循环中的continue
          • 代码10
        • do...while循环的流程图
    • 4:goto语句
      • 适用场景
      • 代码11
      • 代码12

嘻嘻,家人们,今天咱们来详细解读分支与循环语句,废话不多讲,开干!

1.语句的定义

C语言中可以把语句分为以下五类:

  • (1):表达式语句; eg------> 3 + 5;
  • (2):函数调用语句;eg------->printf(“hello world\n”);
  • (3):控制语句;
  • (4):复合语句;
  • (5):空语句

咱们这一讲后面介绍的是控制语句哦!

控制语句

定义:用于控制程序的执行,以实现程序的各种结构方式**(C语言中支持三种结构:顺序结构、选择结构、循环结构)**,它们由特定的语句定义符组成,C语言中有九种控制语句。

(1):条件判断语句(分支语句):if语句、switch语句。
(2):循环执行语句:do while语句、while语句、for语句。
(3):转向语句:break语句、goto语句、continue语句、return语句

2:选择语句(选择结构)

分类

选择语句中共有两种:(1)if语句 (2)switch语句。

2.1:if语句

在生活中,我们会面临各种各样的选择,譬如,如果你好好学习,高考时取得好成绩,拿到名校录取通知书,你的可选择面会宽广很多,否则,你只能去从事体力劳动,这就是选择!

语法形式
#include 
int main()
{
	//语法结构1
	if(表达式)
	{
		语句1;
		语句2;
	}
	
	//语法结构2
 	if(表达式)
    {
        语句1;
      	语句2;
        ....
    }
    
    else
    {
        语句1;
        语句2;


    //语法结构3
    if(表达式1)
    {
       语句1;
       语句2;
       ....  
    }
    else if(表达式2)
    {
       语句1;
       语句2;
       ....  
    }
    else
    {
     语句1;
     语句2;
     ....  
    }
    }
	
	
}

可能家人们对这里的else和else if有些不理解,咱们通过几段代码来具体讲解下!!

代码1
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	return 0;
}

先看这段代码,在这里输入一个年龄值,如果age的大小小于18则会在屏幕打印未成年,也就是说当age<18这个表达式的值为真时,就会执行里面的打印语句。博主在这里输入的15,15小于18,因此条件成立,则会在屏幕打印未成年。

分支与循环语句_第1张图片

代码2
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else
	{
		printf("成年\n");
	}
	return 0;
}

与代码1不同的是,博主在这里多加了个else语句,那这里的else是什么意思呢?是这样字滴,在这里输入一个年龄值,如果年龄值小于18这个表达式为真,则执行if里面的代码块,将不执行else的代码块,如果年龄值小于18这个表达式为假,则执行else里面的代码块。

分支与循环语句_第2张图片

代码3
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int age;
    scanf("%d", &age);
    if (age < 18)
    {
        printf("青少年\n");
    }
 	/*这里不能写成  18< age <28,因为是从左向右执行,假设age == 5,age > 18这个表达式的值为假,为假则为0,0 < 28这个表达式的值为真,因此条件成立;
	*/
    else if (age >= 18 && age < 28)
    {
        printf("青年\n");
    }

    else if (age >= 28 && age < 40)
    {
        printf("中年\n");
    }

    else if (age >= 40 && age < 60)
    {
        printf("壮年\n");
    }

    else if (age >= 60 && age <= 100)
    {
        printf("老年\n");
    }

    else
    {
        printf("老寿星\n");
    }
    return 0;
}

与代码1和代码2不同的是,代码3又多了else if语句,那是什么意思呢,在if语句中,if 与 else if 以及 else语句三者为一体且为递进关系并且从上往下依次执行,什么意思呢?,譬如在代码3中,输入一个年龄值,如果age < 18这个表达式为真,则执行if里面的代码块,那么后面的else if 以及else将不再执行,直接跳过。如果age < 18这个表达式的值为假,则会进入到第一个else if进行判断,如果age >= 18 && age < 28这个表达式的值为真,则执行第一个else if里面的代码块后面的代码将不再执行;为假的话,那么进入到第二个else if进行判断。依此类推,如果说 age的值既不满足if语句的判断条件也不满足剩下的else if里面的判断条件,则执行else语句里面的代码块。

分支与循环语句_第3张图片
分支与循环语句_第4张图片
分支与循环语句_第5张图片

悬空else(一般匹配离的最近且未进行匹配的if语句)
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("hehe\n");
    else
            printf("hello world\n");
    return 0;
}

咱们看这段代码,很多小伙伴会认为这里会在屏幕上打印hello world,因为刚刚博主讲了嘛,if语句里面的表达式,为假的话,那么就执行else语句里面的代码块,那么到底是不是呢,咱们运行下看看。

分支与循环语句_第6张图片

咱们可以看到,博主运行这段代码,屏幕上什么都没打印,这与家人们的预想不对啊,家人们会想,肯定是博主讲错了,哈哈,其实是这样的,else在匹配的时候有个规则,就是一般会匹配它离得最近的if语句,也就是说,这里的else语句匹配的是括号里面的表达式为b == 2 的if语句。这里a == 1 这个表达式的值为假,因此不进入第二层的if判断,直接跳过,所以在屏幕上什么都不打印滴。有的小伙伴们就在想,博主为什么这里代码要这么写呢?直接把else和第二个if语句对齐不就好了嘛。是这样滴,博主这么写,一方面要给家人们讲解下这个悬空else的知识,另外一方面就是要告诉家人们,咱们在写代码的时候,要形成良好的代码风格,譬如适当地缩进,以及if跟多条语句时要用{}框起来等等,给看代码的人,有一种一目了然的感觉。

2.2:switch语句

刚刚博主讲了分支语句中的if语句,接下来博主将详细讲解分支语句中的第二种语句-----switch语句

语法形式
#include 
int main()
{
	switch(整型表达式)
	{
		/*为一些case语句,
		例如: case 整型常量表达式:
			  语句项*/
		语句项;	
	}
	return 0;
}

可能家人们对这里的语法形式还有些模糊,接下来博主将通过一段代码来具体讲解下。

#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int day = 0;
    scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("Weekday");
		break;
	case 6:
	case 7:
		printf("Weekend");
		break;
	}
    return 0;
}

现在博主想实现这样一种功能,当我输入1-5这五个数字中的任意一个时,屏幕上将打印Weekday,当输入6或者7时,屏幕上将打印Weekend。这个时候就要用到咱们的switch语句来实现这种多分支的功能,switch语句后面的整型表达式博主放入的是day这个变量,当博主输入值的时候,就会对应地去匹配,然后执行case后面的语句项。

分支与循环语句_第7张图片
分支与循环语句_第8张图片

可能有的uu们对语句项里面的break有些疑惑,接下来博主将具体讲解这个break的作用!

2.2.1:switch语句中的break

咱们先看以下两段代码,博主将通过以下两段代码来讲解break的作用。

代码1
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int day = 0;
    scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("Weekday\n");
	case 6:
	case 7:
		printf("Weekend\n");
	}
    return 0;
}

分支与循环语句_第9张图片

uu们可能对这个运行结果有些疑惑,明明输入的是5,应该只在屏幕上打印weekday呀,为什么还会打印
weekend呢?那咱们再看最初的那个含有break的那段代码。

代码2
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int day = 0;
    scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("Weekday\n");
		break;
	case 6:
	case 7:
		printf("Weekend\n");
		break;
	}
    return 0;
}

分支与循环语句_第10张图片

相信uu们通过对比这两段代码,应该对这个break有了一定的初步印象。switch语句中的break是用来结束分支语句的判断(把语句列表划分为不同的分支部分),若不加break的话就会持续输出(即从满足判断的节点条件依次往下开始全部执行,直至遇到break)所以这也是为什么在第一段代码输入5的时候,会打印weekend的原因,因为先从case 5 那个节点开始执行,执行完以后没有遇到break,因此会继续向下执行。所以在使用switch语句的时候,要记得使用break哦,不然没办法直接实现分支,搭配使用break才能实现真正的分支哦!

2.2.2:switch语句中的default子句

有些uu们可能在想,如果我输入的值与case语句后面的值不匹配咋办呢?其实也没什么,结果就是所有的语句都被跳过而已啦,但是如果不想忽略不匹配所有case语句的表达式的值时该怎么办呢,这个时候就可以在语句列表中增加一条default子句。

定义
  • 如果整型表达式的值与case的整型常量表达式的不匹配则执行default里面的语句;因此defalut子句可以放在switch语句中的任何位置。
代码1
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int day = 0;
    scanf("%d", &day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("Weekday\n");
		break;
	case 6:
	case 7:
		printf("Weekend\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
    return 0;
}

咱们看这段代码,当输入除1-7以外的值时,就会执行default里面的语句,例如博主在这里输入9,此时屏幕上就会打印输入错误。这里博主建议uu们在使用switch语句时,除了在case语句后面加上break以外,在每个switch语句都放一条default子句甚至在default子句后面加上break,这也是个良好的编程习惯哦!
分支与循环语句_第11张图片

3:循环语句(循环结构)

分类

(1):while循环
(2):for循环
(3):do while循环

3.1:while循环

相信uu们已经掌握了if语句,当条件满足的情况下,if语句后的语句执行,否则不执行,**但是这个语句只会执行一次。**但我们在生活中有很多的事情需要重复不断地去做,那我们应该怎么做呢? C语言中给我们引入了while语句,可以实现循环。

语法形式
#include 
int main()
{
	//跟在循环语句后面的{}里面的代码这一个整体称为循环体
	//若表达式为真则执行循环体里面的循环语句。
	while(表达式)
	{
		循环语句;
	}
}

可能uu们对while循环还是有一点点小疑惑,接下来博主将通过这段代码来具体讲解。

代码1
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
    return 0;
}

这段代码的功能是在屏幕上打印1-10的数字,这里博主就使用了while循环,而进入循环体的条件是i <= 10这个表达式的值为真,为什么是i <= 10呢?因为我的要求只是打印1-10,并且每次打印后,我的变量 i 还要进行变化,不然的话,就会成为了死循环。

分支与循环语句_第12张图片

3.1.1:while循环中的break

上面的代码已经帮uu们了解了while语句的基本用法,那么接下来再了解下while循环中break和continue,首先先讲解break语句,我们将通过一段代码来具体讲解。

代码2
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		if (5 == i)
		{
			break;
		}
		i = i + 1;
	}
    return 0;
}

分支与循环语句_第13张图片

这段代码的输出结果是1 2 3 4 5,那么是为什么呢?核心就在于这个break,在循环中,只要遇到break,就会停止后期的所有的循环,直接终止循环,因此while循环中的break是用于永久终止循环的,当变量 i 的值为1的时候,此时判断循环条件,进入循环体,打印数字1,然后不满足if条件的判断,依次类推,当变量 i 的值为5的时候,此时先打印数字5,然后此时 5 == i这个表达式的值为真,进入判断,执行break语句,此时跳出整个循环,直接到达了return 0这个语句。

3.1.2:while循环中的continue
代码3
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	while (i <= 10)
	{
		
		i = i + 1;
		if (5 == i)
		{
			continue;
		}
		printf("%d ", i);
	}
    return 0;
}

分支与循环语句_第14张图片

这段代码的执行结果为什么是这样子的呢?核心就在与这个continue,continue在循环语句中是用于终止本次循环的,也就是说本次循环中continue的后边的代码将不会再执行,而是直接跳转到了while语句的判断部分。进行下一次循环的入口判断。当变量 i 的值为4的时候,此时进入循环体,变量 i 先加1,此时变量 i 的值为5,那么if语句后面的表达式的值为真,此时就会continue跳过本次循环,因此后面的printf语句将不再执行,直接回到判断部分, 5 <= 10这个表达式成立,因此进入循环,变量 i 再进行 + 1,此时变量 i的值为6,不满足if语句后面的条件判断,此时将打印数值6,周而复始,直到循环结束。

while循环的流程图

分支与循环语句_第15张图片

总结
  • while循环中的break是用于永久终止循环的。
  • while循环中的continue是用于终止本次循环即本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

3.2:for循环

讲解完while循环之后,接下来,博主将详细讲解循环语句中的第二种,for循环。

语法形式
#include 
int main()
{
	for(表达式1;表达式2;表达式3)
	{
		循环语句;
	}
}

(1):表达式1为初始化部分,用于初始化循环变量。
(2):表达式2为条件判断部分,用于判断循环什么时候终止。
(3):表达式3为调整部分,用于循环条件的调整。

可能uu们对for循环还是有些迷惑,接下来博主将通过一段代码来具体讲解下。

代码1
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 0;
    //i = 1为初始化部分; i <= 为判断部分; i++为调整部分
    for (i = 1; i <= 10;i++)
    {
        printf("%d ", i);
    }
    return 0;
}

分支与循环语句_第16张图片

这里博主使用了for循环来打印1-10这10个数字,执行过程是这样子的
(1):首先将变量 i 初始化为1
(2):然后进入判断部分,此时 i <= 10这个表达式为真,因此进入循环体,然后打印 i
(3):接着进入调整部分,变量 i 进行+1,此时变量i 的值为2。
(4):接着再进入判断部分,此时 i <= 这个表达式为真,进入循环体。
周而复始,知道 i <= 10这个表达式为假时,跳出循环。

代码2
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    //初始化部分
    int i = 1;
    //判断部分
    while (i <= 10)
    {
        printf("%d ", i);
        //调整部分
        i++;
    }

    for (i = 1; i <= 10;i++)
    {
        printf("%d ", i);
    }
    return 0;
}

我们可以对比一下for循环和while循环,会发现while循环中依然存在循环的三个必须条件,但是由于代码风格的问题使得三个部分偏离较远,这样在查找修改就不够集中和方便。因此,for循环的风格要更胜一筹;for循环使用的频率也最高。

3.2.1:for循环中的break

前面在while循环中有break,那么在for循环中也同样存在,并且作用相同,用于永久终止循环。

代码3
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 0;
    for (i = 1; i <= 10;i++)
    {
        printf("%d ", i);
        if (i == 5)
            break;
    }
    return 0;
}

分支与循环语句_第17张图片

当变量 i 的值为5的时候,此时就会break跳出整个循环,因此在屏幕上只会打印1-5这5个数字

3.2.2:for循环中的continue

while中的continue是跳过本次循环,不执行continue后面的代码,直接回到循环的判断部分,那么在for循环中是不是也是如此呢?我们看如下代码

代码4
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 0;
    for (i = 1; i <= 10;i++)
    {
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}

分支与循环语句_第18张图片

我们可以看到,屏幕上除了5以外,其他的数字都打印了,原因是这样子的:在for循环中的continue也是跳过本次循环,不执行continue后面的代码,但是不是回到循环的判断部分,而是回到循环的调整部分,这里和while循环有差异,因此在变量i为5的时候,此时跳过本次循环,回到调整部分i++,然后再进入判断部分。

3.2.3:for循环中的变种
代码5
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    for (; ;)
    {
        printf("hello world\n");
    }
    return 0;
}

for循环中的初始化部分,判断部分,调整部分是可以省略的,初始化部分和调整部分省略就相当于啥事都没做,而省略判断部分,此时恒为真,将陷入死循环。

分支与循环语句_第19张图片

代码6
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 0;
    for (i = 1; i<= 10; i++)
    {
        i = 6;
        printf("%d ",i);
    }
    return 0;
}

不可在for循环体内修改循环变量,因为这样很容易导致死循环!

分支与循环语句_第20张图片

代码7
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 0;
    int j = 0;
    int count = 0;
    for (i = 0; i< 10; i++)
    {
        for (int  j = 0; j < 10; j++)
        {
            printf("hello world\n");
            count++;
        }
    }
    printf("%d", count);
    return 0;
}

分支与循环语句_第21张图片

我们会发现,这里打印了100次hello world,原因是这样子滴:当for循环嵌套时,会先执行完内部的for循环,然后执行结束以后,再回到外层循环的调整部分,接着再进入判断部分,然后执行第二次外层循环,因此这里就会打印 10 * 10 = 100次的hello world。

for循环的流程图

分支与循环语句_第22张图片

总结
  • for循环中的break用于终止整个循环。
  • for循环中的continue用于跳过本次循环,与while循环不同的是,for循环中的continue会回到调整部分,而while循环中的continue会回到判断部分。
  • for循环中的三个部分都是可以省略的,省略初始化和调整部分相当于啥事也没做,而省略判断部分,判断将恒为真,将陷入死循环。

3.4:do…while循环

讲完了两种循环语句,接下来讲最后一种循环语句-----do…while语句,与前面两种循环语句不同的是,do…while循环有个特点:循环至少执行一次。

语法形式
#include 
int main()
{
	do
	{
		循环语句;
	}
	while(表达式);
}
代码8
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	do
	{
		printf("%d ", i);
		i++;
	} while (i <= 10);
    return 0;
}

咱们看这段代码,首先会执行一次循环体即先打印一次变量 i 的值,然后对i进行自增,最后再进入到判断部分,此时进入判断时,i 的值为2。周而复始,直到循环结束。

分支与循环语句_第23张图片

3.4.1:do…while循环中的break

do…while循环中的break与前面两种循环的break的作用一样,都是用于永久终止循环滴。

代码9
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	do
	{
		printf("%d ", i);
		if (5 == i)
		{
			break;
		}
		i++;
	} while (i <= 10);
    return 0;
}

分支与循环语句_第24张图片

3.4.2:do…while循环中的continue

do…while循环中的continue和while循环中的continue作用一样,都是跳过本次循环,不再执行continue后面的代码,回到循环的判断部分

代码10
#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
    int i = 1;
	do
	{
		i++;
		if (5 == i)
		{
			continue;
		}
		printf("%d ", i);
	} while (i <= 10);
    return 0;
}

分支与循环语句_第25张图片

do…while循环的流程图

分支与循环语句_第26张图片

4:goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上讲goto语句是没有必要的,实践中没有goto
语句也可以很简单地写出代码。但是在某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内存循环退出到上一层的循环。

适用场景

#include 
int main()
{
    for(...)
    {
        for(...)
        {
            for(...)
            {
                if(disaster)
                    goto error;
            }
        }
    }
	error:
    	//处理错误情况
    	if(disaster)
}

代码11

#define  _CRT_SECURE_NO_WARNINGS
#include 
int main()
{
again:
    printf("hehe\n");
    printf("hehe\n");
    //goto语句会跳转到again的地方去
    goto again;
    return 0;
}

这里的goto语句会跳转到again的地方去,这样不断执行,最后相当于是个死循环了。
分支与循环语句_第27张图片

代码12

#define  _CRT_SECURE_NO_WARNINGS
/*1:电脑运行起来后,一分钟之内关机
  2:如果输入:我是猪,就取消关机*/
#include 
  //使用strcmp函数必须导入的头文件
#include 
int main()
{
    char input[20] = { 0 };
    /*system函数
    功能:在已经运行的程序中执行另外一个外部程序
    参数:外部间可执行程序名字
    返回值:成功:0
    失败:任意数字*/
    system("shutdown -s -t 60");
again:
    printf("请注意,你的电脑在60s内关机,如果输入:我是猪,就取消关机\n");
    scanf("%s", input);
    /*比较两个字符串是否相等不可以使用==,而应该使用一个库函数strcmp函数
    如果返回值为0,则说明两个字符串相等*/
    if (strcmp(input, "我是猪") == 0)
    {
        //取消关机
        system("shutdown -a");
    }
    else
    {
        goto again;
    }
    return 0;
}

这段代码是使用goto语句写的一个小关机程序,博主在代码中写了详细的注释方便uu们理解!

好啦,关于分支循环语句的详细讲解就到这里啦!如果uu们觉得博主讲的不错的话,请动动你们滴滴给博主点个赞,你们滴鼓励将成为博主源源不断滴动力!

你可能感兴趣的:(c语言)