C语言基础(4)

        还记得我们在前面的文章简要的介绍了一下分支语句和循环语句么,那么今天我们就仔细来讲讲这两种语句吧。

1. 什么是语句?

        在讲这两种语句之前,我们先来探讨一下什么是语句吧。C语言定义中,语句是一种结构化的程序设计语言,它支持:顺序结构,选择结构(分支语句),循环结构(循环语句) 这三种语句结构。
        而C语言中的语句又可分为这5类:1. 表达式语句        2. 函数调用语句         3. 控制语句      4. 复合语句         5. 空语句
        我们今天主要讲的则是控制语句控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句,也可分为以下三类:
        1. 条件判断语句也叫分支语句:if语句、switch语句;
        2. 循环执行语句:do while语句、while语句、for语句;
        3. 转向语句:break语句、goto语句、continue语句、return语句。

2. 分支语句(选择结构)

        生活中我们许多事情也需要做出选择,分支语句也是通过判断条件来决定执行哪些语句。分支语句主要有 if语句 和 switch语句。

2.1 if...else...语句

if语句的语法结构主要有以下三种,其中第3种是多分支语句。

1. if(表达式)
         语句;
                
2. if(表达式)
         语句1;
    else
         语句2;
             
3.  //多分支    
    if(表达式1)
         语句1;
    else if(表达式2)
         语句2;
    else
         语句3;

我们直接上代码实操演示。

        我们在if语句中加上判断条件age<18,当从键盘中赋予变量age的值小于18时,则if语句中的条件为真,因此会执行if语句中的代码。而当变量age不小于18(即大于等于18)时,if语句中的代码便不会被执行。

        if...else...语句和if语句基本类似,唯一的区别则是当不满足if中的条件时,会转向执行else语句中的代码块。

        对于这种多分支的if语句,当if语句中的判断条件不满足时,会转而再去判断else if语句中的条件,如果两者都不满足条件,则执行else语句中的代码块。
        也许大家会这样想:那为什么不直接写多个单if语句,而要写这种多分支结构呢?其原因就是在这种多分支语句中,如果某个分支的判断条件满足,则后面分支的条件都不会再判断了,直接继续执行分支语句外的代码块(如假设上面代码中if语句的条件满足,那么esle if 和 else都不会再进行判断执行了)。如果我们直接写多个if语句,那么在运行代码时,每个if语句中的条件都需要进行判断,这样当有很多个选择语句时,就会大大降低代码执行的效率。

        让我们来看看上面代码,大家是不是以为else是和第1个if语句匹配呢,实则不然,在输出框中什么也没输出。这是因为else是和它离的最近的if匹配的,即上图中的else是和第2个if语句匹配的,因此当a==1这个条件不满足时,就不会进入第一个if语句中。
        所以我们在写代码时,代码风格是极其重要的,适当的添加 {} 能使代码逻辑更加清楚。

2.2 switch语句

switch 语句也是一种分支语句,常常用于多分支的情况。switch语句的语法结构如下:

switch ( 整型表达式 )
{
         语句项;
}
那语句项是什么呢?
是一些 case 语句:
如下:
case 整形常量表达式 :
         语句 ;

注:char是字符类型,字符的本质是字符的ASCII值,ASCII值是整型,因此在归类时,字符是可以归类到整型的。

#include<stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	}

	return 0;
}

        如上代码,我们将变量day设置为非0值(为真)时, 就能进入switch语句中,再将变量day与case中的常量表达式一一匹配,哪个匹配上了则执行哪个case中的语句。执行结果示例如下:              接着来讲讲在switch语句中的break:在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。break语句的实际效果是把语句列表划分为不同的分支部分。                那具体要怎么理解呢,来看看下面代码与上面代码的不同和结果之间的区别:                        

#include<stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期1\n");
	case 2:
		printf("星期2\n");
	case 3:
		printf("星期3\n");
	case 4:
		printf("星期4\n");
	case 5:
		printf("星期5\n");
	case 6:
		printf("星期6\n");
	case 7:
		printf("星期天\n");
	}

	return 0;
}

        为了便于讲解,我们将含有break的代码称为代码1,将不含break的代码称为代码2。从结果中我们能明显的看到代码2的输出结果并不是我们想要的。这是因为如果没有break,switch语句就无法实现真正的分支。也就是当day与某个case的常量表达式匹配成功后,代码就会执行该case中的语句,如果想要出switch语句, 就必须找到break来跳出switch语句,否则就会将剩下case中的语句全部执行。         
        通俗的理解就是:case 决定switch语句的入口,break 决定switch语句的出口。
                                     switch语句从哪个case进去后一直顺序执行下去,直到遇到break才跳出。                                                  
        注:switch语句是可以嵌套的,而 break 只会跳出一层switch语句。

我们再来讲讲switch语句中的default语句
        如果表达的值与所有的case标签的值都不匹配怎么办? 其实也没什么,结构就是所有的语句都被跳过而已。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
        但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 那你可以在语句列表中增加一条default子句,default标签写在任何一个 case 标签可以出现的位置。
        当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

#include<stdio.h>
int main() {
	int day = 0;
	scanf("%d", &day);
	// 在switch语句中,语法上不考虑case和default的语句顺序
	switch (day)
	{
	default:  // 当case语句都不匹配时,自动走到default语句
		printf("输入错误\n");
		break;
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	
	}

	return 0;
}

3. 循环语句

在C语言中,循环语句有三种,分别为:1.while语句      2.for语句      3.do...while语句。

3.1 while循环语句

        在前面我们已经实现了分支语句,但分支语句只能执行一次。有些事情当我们需要重复执行时,循环语句便派上用场了。C语言中给我们引入了: while 语句,可以实现循环。

while语句的语法结构:

while(表达式)
          循环语句;

while语句的执行流程如下图:

我们主要来讲讲break和continue在while循环语句中的作用。
        1.break在while循环中的作用:在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所以,while中的break是用于永久终止循环的。示例如图2。
注:当有多层嵌套循环时,break只会跳出一层循环,不会终止所有循环。
        2. continue在while循环中的作用就是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。示例如图3。

3.2 for循环语句

for循环语句的语法结构如下:

for(表达式1; 表达式2; 表达式3)
             循环语句;

那么for循环中的各表达式分别有什么作用呢?
1. 表达式1:表达式1为初始化部分,用于初始化循环变量的。
2. 表达式2:表达式2为条件判断部分,用于判断循环时候终止。
3. 表达式3:表达式3为调整部分,用于循环条件的调整。

for循环的执行流程如下:

for循环的运行结果与while循环的运行结果基本一样,这里我就不再过多的讲解了,有不懂的地方欢迎留言评论。

3.3 do...while()循环

        也许有人会好奇,do...while()循环 和 while()循环有什么区别呢。答案就是 do...while()循环 至少会循环一次,也就是说该循环是先执行do语句中的代码,再进入while判断条件是否满足。

do...while()循环的语法结构:

do
      循环语句;
 while(表达式);

do...while()语句的执行流程如下图:

4. goto语句

        goto语句也称为无条件转移语句,它的作用是让程序的执行流程从当前位置跳转到同一函数内的另一个位置,这个位置由一个标签(label)来标识。
        从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
        例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

#include<stdio.h>
int main() {
	
	for (int i = 1; i <= 5; i++) {
		for (int j = 0; j < 6; j++) {
			for (int k = 0; k < 7; k++) {
				if (k == 5) {
					goto out;
				}
				printf("%d ", k);
			}
		}
	}

out:
	printf("跳出循环\n");

	return 0;
}

goto语句的应用场景如上图。

注:1. goto语句只是一个语法(关键字),而不是一个函数,所以不需要包含头文件。
       2. goto 语句只能在一个函数内部跳转,不能跨函数跳转。

本篇本章就到此结束了,码字不易,望多多支持!

相关推荐

  1. C语言K&R圣经笔记 4.1函数基础

    2024-04-04 13:30:02       60 阅读
  2. 嵌入式学习——C语言基础——day4

    2024-04-04 13:30:02       36 阅读
  3. C语言】(4)数组

    2024-04-04 13:30:02       51 阅读
  4. <span style='color:red;'>C</span><span style='color:red;'>语言</span>-<span style='color:red;'>4</span>

    C语言-4

    2024-04-04 13:30:02      43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-04 13:30:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-04 13:30:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-04 13:30:02       87 阅读
  4. Python语言-面向对象

    2024-04-04 13:30:02       96 阅读

热门阅读

  1. LeetCode | 数组 | 双指针法 | 27. 移除元素【C++】

    2024-04-04 13:30:02       37 阅读
  2. GDAL源码剖析(十二)之GDAL Warp API使用说明

    2024-04-04 13:30:02       34 阅读
  3. python实现TCP服务器

    2024-04-04 13:30:02       36 阅读
  4. NVM切换Node版本失败(已解决)

    2024-04-04 13:30:02       40 阅读
  5. 快速使用 Vision-RWKV 进行图像分类

    2024-04-04 13:30:02       47 阅读
  6. pip包安装用国内镜像源

    2024-04-04 13:30:02       35 阅读
  7. Python栈和队列

    2024-04-04 13:30:02       37 阅读
  8. PyTorch 常见用法介绍

    2024-04-04 13:30:02       39 阅读
  9. day1 | 数组 part-1 | 704 二分查找、27 移除元素

    2024-04-04 13:30:02       42 阅读
  10. 导入excel内容

    2024-04-04 13:30:02       33 阅读
  11. 73.矩阵置零

    2024-04-04 13:30:02       31 阅读