C语言---分支和循环语句

news2024/11/25 2:38:41

1、什么是语句

C语言语句可以分为五类:

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句

C语言有九种控制语句

可以分成一下三类:

  • 条件判断语句也叫分支语句:if语句,switch语句;
  • 循环执行语句:do while语句、while语句、for语句;
  • 转向语句:break语句、goto语句、continue语句、return语句。

2、if语句

if语句的语法结构:

if (表达式)             //表达式结果如果为真或者非0,那这个表达式就会运行
    语句;
if (表达式)           
    语句;             //这里如果只有一条语句,那就不需要带{},也可以带
else
    语句2;


if (表达式)           
    语句1;             //这里大于一条语句,那就需要带{}
	语句2;
else
    语句2;
//多分支
if (表达式1)           
    语句;            
else if(表达式2)
    语句2;
else
    语句3;


//注意:如果一个表达式同时满足if语句有满足else if语句,因为if语句先接收的这个表达式,那这个表达式只会进入到if语句里面。

2.1、if是和靠的最近的else相匹配的

下面先来看段代码:

#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;
}

输出:

在这里插入图片描述

显而易见这里的输出竟然为空!!!

这是问什么呢?不应该是输出:haha 的结果吗?为什么不对呢?

这是因为else是会和最近的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是靠的最近进行匹配的,不是说else和if在同一缩进进行匹配的。

3、switch语句

switch语句也是一种分支语句

常常用于多分支的情况

比如:

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六

语法:

switch (整型表达式)
{
        语句项;
}

而语句项是什么呢?

//语句项是一些case语句
//如下:
case 整形常量表达式      //case后面必须是整形常量,当然使用字母表示也行,因为字母的ASCII也是整数
    语句;

使用switch实现星期查询

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");

	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期日\n");
		break;
	}
	return 0;
}

说下switch原理:

从switch中输入相对应的编号,根据编号找到相对应的case语句,这样就算进入switch语句了,然后匹配后经过break语句出switch语句。

3.1、新的需求

要求:

  • 输入1-5,输出“weekday”
  • 输入6-7,输出“weekend”
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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;
}

这说明case语句在没有遇到break语句之前是一下向下执行,知道遇见break语句才会跳出switch语句。

3.2、default字句

如果表达的值与所有的case标签的值都不匹配怎么办?

其实也没什么,都不匹配最终肯定是会全部跳过而已。

程序也不会终止,也不会报错,但是当在都不匹配的情况下我们最后提示一下。

那这就需要default字句了。

注意:switch语句中只能出现一个default字句

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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("输出错误");
		break;
	}
	return 0;
}

输出:

在这里插入图片描述

4、循环语句

  • while
  • for
  • do while

4.1、while

语法结构

while (表达式)
{
    循环语句;
}

4.1.1、break语句

只要while循环中执行了break语句,那么整个while循环将会停止,这个break语句在while循环的那任何部分中,while都会立即终端

代码示例:

#include <stdio.h>
int main()
{
	int a = 1;
	while (a < 11)
	{
		if (5 == a)
		{
			break;      //这个break语句看着是在if语句中。但是一旦它被执行,那么整个while语句将会停止
		}
		printf("%d\n",a);
		a++;
	}
	return 0;
}

输出:

在这里插入图片描述

4.1.2、continue语句

一旦在while语句中执行了continue语句,那么此次循环将会直接跳过continue后面的代码,然后判断循环,如果继续则直接进行下一次循环(就直接从while (a<11)处开始执行)。

#include <stdio.h>
int main()
{
	int a = 1;
	while (a < 11)
	{
		if (5 == a)
		{
			continue;        //当a=5时,不在执行后面的代码,直接跳过从while循环开始
		}
		printf("%d\n",a);
		a++;
	}
	return 0;
}

输出:一直死循环的输出:1 2 3 4

在这里插入图片描述

4.2、使用while循环清理缓冲区

4.2.1、getchar()和putchar()

  • getchar()函数用于从键盘上读取数据和scanf一样
  • putchar()函数用于输出数据
#include <stdio.h>
int main()
{
	int ch = getchar();   //我们在键盘中输入“e”,这个e会被转为相应的ASCII值存入ch中
	printf("%c\n", ch);   //然后在转为字符(%c)进行输出
	putchar(ch);          //这个可以直接输出,和上面的打印的效果是一样的,这是另一种方法
	return 0;
}

输出:

在这里插入图片描述

但是这里我们有个疑问:

int ch = getchar(); 

明明getchar()接收的是个字符,为什么我们要用int类型来接收呢?为什么不用char类型接收呢?

这里解释一下:
因为在读到字符时,会转为相应的ASCII码值,所以说放在int类型是没有问题的。

重点:如果getchar()在读取过程中遇到了错误/不正常或者遇到了文件结束,那么这个函数会返回个EOF

EOF--------end of file文件结束标志

我们来看一下EOF的定义(define)

#define EOF    (-1)

可以看到EOF定义的值是-1,-1是个整数,所以说我们接收getchar()返回的数据就应该用int类型去接受

那好知道了这些我们就可以用while循环来实现清理缓冲区的功能:

#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)    //这里ch接收getcha返回的数据不等于EOF,说明返回的是个正常的字符,那就可以正常输出
	{
		putchar(ch);
	}
	return 0;
}

输出:

在这里插入图片描述

会发现输出不会停止,这是Ctrl+z,然后在回车就可以终止程序了。

Ctrl+z就是让getchar返回一个EOF,这样程序就终止了

【重点:】下面来好好理解一下这个程序的逻辑:

这里先提出个问题?为什么上面的输出会自动换行?

这里设计到缓冲区的概念

我们所知道的scanfgetchar函数来从键盘上获取数据,是我们从键盘上一输出字符,scanfgetchar函数就能接收到的吗?其实并不是,正确的顺序是:我们在键盘上输出字符,这个字符会进入缓冲区,此时scanfgetchar函数检测到缓冲区有字符,这个时候scanfgetchar函数才会把该字符从缓冲区中拿出来。

那为什么会自动换行呢?

在这里插入图片描述

还是上面代码流程分析:当我们输入“a”并且回车后,(回车相当于输入了\n),首先判断a!=EOF,因此执行putchar(ch)然后打印出“a”,然后再次循环,因为缓冲区里里面“a”已经被读取了,所以还剩个“\n”,然后getchar直接读取,因为“\n”!=EOF,所以在次执行putchar(ch),所以就会自动换行了。

4.2.2、深度解析—清理缓冲区这段代码

先来看段代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);   //这里不用在&password,因为数组名就是数组首元素地址,所以不用取地址
	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if (ret == 'Y')
		printf("Yes\n");
	else
	{
		printf("No\n");
	}
	return 0;
}

输出:

在这里插入图片描述

显然这样的输出结果是不对的,明明我还没确认,程序直接就打印了NO

分析:当我们在键盘中输入:abcdef,然后回车(\n),此时输入缓冲区里面有了:“abcdef\n”,scanf指挥取它所需要的。因此scanf把“abcdef”给拿走了,因此password=“abcdef”,但是此时缓冲区里面还有个“\n”,然后程序向下走getchar获取数据,一看缓冲区里面还有个“\n”,因此getchar直接拿走了“\n”,然后进入if判断,“\n”!=‘Y’,所以程序输出No。

在这里插入图片描述

那怎么解决呢?我们想办法只要让缓冲区里面没有字符就行了,可以这样实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);   
	getchar();     //这里在添加个getchar(),提前把那个\n读取掉,那下面那个getchar()就可以正确判断了
	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if (ret == 'Y')
		printf("Yes\n");
	else
	{
		printf("No\n");
	}
	return 0;
}

但是这种写法是比较粗鲁的,不适用每一种情况。比如:我们在键盘中输入:abcdef sdf(中间有个空格)

在这里插入图片描述

这样又不行了。我们来分析一下为什么又出错了:

首先scanf会读取缓冲区里面的“abcdef”,也就是说scanf会读取到空格前,紧接着第一个getchar()会读取空格,那就相当于第一个getchar()被使用了,然后下面的getchar()会读取到sdf,因为’sdf’ != ‘y’,所以会输出No。

这是我们能感知到,第一个错误的解决办法是需要清理缓冲区里面的一个字符,而这个是需要清理缓冲区里面的许多个字符才能解决,因此我们需要循环解决。

我们可以循环使用getchar()把空格到“sdf”以及后面的“\n”全部读取掉,这样就行了

下面我们来实现个正确的方法:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);   
	int ch = 0;                          //start
	while ((ch = getchar()) != '\n')
	{
		;
	}                                    //end
	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if (ret == 'Y')
		printf("Yes\n");
	else
	{
		printf("No\n");
	}
	return 0;
}

5、for循环

5.1、语法

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

__表达式一:__表达式一为初始化部分,用于初始化循环变量的。

__表达式二:__表达式二为条件判断部分,用于判断循环时终止。

__表达式三:__表达式三为调整部分,用于循环条件的调整。

for循环执行顺序:

第一遍循环:

在这里插入图片描述

第2、3、4、5、6…循环:

在这里插入图片描述

5.2、break,continue

在for循环和while循环里面break语句的效果一样。

同样在for循环和while循环里面continue语句有一点小差别

如下图:

在这里插入图片描述

其中for循环在遇见continue语句后是跳过后面的代码,然后跳到“i++”(调整)中去了

二while循环在遇见continue语句后是跳到了判断里面去了。

5.3、for语句的循环控制变量

建议:

  • 不可在for循环体内修改循环变量,防止for循环失去控制。
  • 建议for语句的循环控制变量取值采用“前闭后开区间”写法。

5.4、for循环的变种

1、死循环

#include <stdio.h>
int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	return 0;
}

__结论:__for循环的判断部分省略意味着判断或恒成立,而初始化,调整省略没事(但最好不要省略)。

2、for循环采用多个变量去控制

#include <stdio.h>
int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y>5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

6、do-while循环

6.1、do语法

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

打印1-10:

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

do循环最少循环一次。

6.2、break和continue

作用一样。

7、goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号

从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码

但是在某些场合下goto语句还是得用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。

多层循环这种情况使用break是达不到目的的,它只能从内层循环到上一层的循环。

先来看一下goto的效果:

#include <stdio.h>
int main()
{
again:                     //标签
	printf("hehe\n");
	printf("haha\n");
	goto again;
	return 0;
}


//但是goto不能跨函数跳转,如下就是不行的
void test()
{
	again;
}

int main()
{
	printf("hehe\n");
	printf("haha\n");
	goto again;
	return 0;
}

在这里插入图片描述

goto语句真正适合的场景下:

for (...)
	{
    	for (...)
        {
            for (...)
            {
                if (disaster)
                    goto error;            #这样可以根据error标签直接跳过两层for循环
            }
        }
    error:
    	if (disaster)
            //处理错误情况
	}

7.1、使用goto语句模拟关机程序

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#include <string.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");             //电脑在60s内关机
again:
	printf("电脑即将在60秒内关机,如果不想关机,输入:我是猪,即可解决。\n");
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
		printf("已取消关机\n");
	}
	else
	{
		goto again;
	}
	return 0;
}

输出效果:

在这里插入图片描述

当然我们也可以使用循环的方式替代goto

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>
#include <string.h>
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");             //电脑在60s内关机
	while (1)
	{
		printf("电脑即将在60秒内关机,如果不想关机,输入:我是猪,即可解决。\n");
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			printf("已取消关机\n");
			break;
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html+css的图展示100

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章&#xff1a;安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

Ansible基础1——介绍安装、清单文件、配置文件、临时命令参数、常用功能模块

文章目录 一、发展起源1.1 自动化工具对比1.2 Ansible介绍 二、安装流程2.1 安装清单2.2 系统初始化2.3 安装验证 三、清单文件3.1 默认静态清单3.2 自定义静态清单 四、配置文件4.1 优先级4.2 配置参数4.2.1 [defaults]配置4.2.2 [privilege_escalation]配置4.2.3 其他配置 4.…

C++ new delete

可执行程序(进程) 的虚拟地址空间: 内核: 操作系统 栈区:函数的形参&#xff0c;非静态的局部变量&#xff0c;函数现场保护数据等等&#xff0c;栈是向下增长的。 共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存&#xff0c;做进程间通…

四足机器人A1目标跟踪

四足机器人A1目标跟踪 前期准备工作1.安装TeamViewer2.将四足机器人所有线连接好3.将四足机器人调至运动模式 运行流程1.开机阶段2.运行阶段 效果展示代码配置 前期准备工作 1.安装TeamViewer 由于外接屏幕损坏&#xff0c;故四足机器人内部配置了TeamViewer&#xff0c;因此…

VM——编写脚本,TCP发送16进制字符串

1、参考&#xff1a; &#xff08;1&#xff09;​​​(246条消息) TCP中发送接收16进制数&#xff08;16进制字符串与字节数组之间的转换&#xff09;_tcp发送16进制字符串_start_continue的博客-CSDN博客 &#xff08;2&#xff09;(246条消息) C#byte String转换_c# byte转…

【网络编程二】UDP与TCP协议你学会了吗~

目录 &#x1f31f;需要知道 1、什么是网络编程&#xff1f; 2、怎么进行网络编程&#xff1f; 3、TCP与UDP的区别&#xff1f; &#xff08;面试题&#xff09; &#x1f31f;一、UDP &#x1f308;1、UDP数据报套接字编程 &#x1f308;2、实现一个简单的UDP回显服务…

java服务端如何接入WebSocket?

日常工作中&#xff0c;我们都是使用http请求&#xff0c;来进行前后交互&#xff0c;那么我们也会有使用websocket来进行前后交互的时候&#xff0c;那么它俩有什么区别呢&#xff1f; http和websocket区别 WebSocket是双向通信协议&#xff0c;模拟Socket协议&#xff0c;可…

商场内如何导航?有没有在商场用的导航?

商场内如何导航&#xff1f;大家可能都有这种感觉&#xff0c;在商场里逛街时&#xff0c;好像经常容易迷路&#xff0c;无论是找出口还是找电梯&#xff0c;总会把自己搞得晕头转向&#xff0c;“每次逛完商场都要给自己预留半小时找车子&#xff0c;也是醉了。”“在商场迷路…

XR云新未来 | 弹性算力赋能可交互、沉浸式商业实践

据XR市场研究报告显示&#xff0c;全球XR市场规模不断扩大&#xff0c;于2020年已超过100亿美元&#xff0c;预计到2025年规模将达到数百亿美元。XR技术广泛应用于娱乐、教育和企业领域&#xff0c;随着技术的进步&#xff0c;高分辨率显示、实时渲染和眼动追踪等创新技术的应用…

Ubantu docker学习笔记(十一)k8s基本操作

文章目录 一、K8s介绍二、容器编排2.1 部署应用2.2 了解应用2.3 公开暴露应用2.4 扩缩应用2.4 滚动更新 三、Kubernetes 对象 相信大家在前面的安装过程中&#xff0c;我们的k8s已经完成了一个超级具体的安装【是不是还是有点难度】&#xff0c;今天我们就在前面已经安装好的基…

消防安全知识答题活动小程序v4.3.0

消防安全知识答题活动小程序v4.3.0 v4.3.0 1&#xff09;实现答题倒计时功能 如果让你给一款答题小程序产品制定一个技术方案&#xff0c;比如实现答题倒计时功能&#xff0c;你会怎么做。 通常&#xff0c;我们对于倒计时的普遍认知是设置一个定时器去实现的&#xff0c;在…

0基础学习VR全景平台篇第32章:场景功能-嵌入文字

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;场景管理模块-嵌入功能文字模块&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四…

Android平台OpenCV入门

一、导入OpenCV 别忘记把libopencv_java3.so添加进来。 二、初始化 OpenCVLoader.initDebug();三、常用方法 1. CvType 数据类型 以CV_64FC2为例&#xff0c;64指64位&#xff0c;F指浮点数&#xff0c;C指通道&#xff0c;2为2通道。 数值具体类型取值范围CV_8U8 位无符…

5.30-cloud support -learning

文章目录 namespaceaccessNSG&#xff08;network security group &#xff09;UDR &#xff08;User-Defined Routing&#xff09;Azure Firewall namespace Namespaces are defined at the Kubernetes cluster level, so each namespace is unique throughout the cluster. I…

C语言笔记 | 数据结构入门指南

文章目录 0x00 前言 0x01 百鸡百钱 0x02 借书方案知多少 0x03 持续更新 0x04 参考文献 0x05 总结 0x00 前言 写这篇《C语言笔记 | 数据结构入门指南》主要是为了帮助更多的编程爱好者打开数据结构的大门&#xff0c;同时也是为了自我编程水平能力的提升。在深奥的数据结构…

正交实验进行方差分析

一、案例介绍 想要从某种草药中提取植物酚&#xff0c;利用专业知识发现可能有三个条件会影响植物酚的提取&#xff0c;每个条件有三个水平&#xff0c;想要通过实验&#xff0c;寻找植物酚的最佳提取条件&#xff0c;其中提取植物酚的参考标准为植物酚的含量&#xff08;案例…

在线原型设计是什么?8款在线原型工具助你高效设计!

原型设计是产品经理、设计师和开发工程师沟通最初的产品设想的重要工具。 在线原型通过云端的方式具象化地呈现产品内容、结构及粗略的布局&#xff0c;说明用户将如何与产品进行交互&#xff0c;搭建了产品经理、设计师和开发工程师沟通的桥梁&#xff0c;帮助产研团队减少信…

什么是深度数据包检测 (DPI)

随着混合工作成为生活的正常部分&#xff0c;新技术每天都在使用&#xff0c;同时总是通过网络传输数据的山体滑坡。通过高正常运行时间、快速解决问题和富有洞察力的情报提供无缝的用户体验至关重要。为此&#xff0c;对网络进行端到端监控非常重要。 深度数据包检测是一种用…

技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!

各位技术面试官&#xff0c;欢迎来到新一期的技术招聘漫谈专栏。 在前两期的专栏中&#xff0c;我们解析了前端工程师&#xff08;点击此处回顾&#xff09;以及 Java 工程师&#xff08;点击此处回顾&#xff09;这两个常见技术岗位的招聘技巧。 今天&#xff0c;我们想把目…