C语言学习笔记之结构篇

news2024/10/6 1:35:03

        C语言是一门结构化程序设计语言。在C语言看来,现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象,即顺序,分支(选择),循环

        所谓顺序就是一条路走到黑;生活中在很多事情上我们都需要做出选择,不同的选择会带来不同的结果,这就是分支;有一些事情往往需要在一定条件内重复去做,这就是循环。

        C语言为了支持分支和循环的实现,引入了分支语句循环语句

目录

分支语句

if 语句

使用细节

switch 语句

使用细节

循环语句

while 语句

使用细节

do...while() 语句

for 语句

使用细节

转向语句 

break 语句

continue 语句 

return 语句

goto 语句 

使用细节


分支语句

        C语言中的分支语句有两种,分别是 if 语句 switch 语句。两种语句分别适用于不同的情景,if语句的使用场景更加普遍。

if 语句

if语句支持单分支,双分支,多分支的实现。单分支语法规则如下:

if (表达式) //表达式结果为真,则执行对应的语句段,否则不执行。
{
	//语句段
}
//...

双分支语法规则如下:

if (表达式) //表达式结果为真,则执行语句段1,否则执行语句段2。
{
	//语句段1
}
else
{
	//语句段2
}

多分支语法规则如下:

if (表达式1)        //如果表达式1结果为真,则执行语句段1,后面的分支不再执行,
{			       //如果表达式1结果为假,则判断表达式2,为真则执行语句段2,后面的分支不再执行				
	//语句段1      //如果表达式2结果为假,则判断表达式3,为真则执行语句段3,后面的分支不再执行
}				  // ...
else if(表达式2)  //依此类推,如果所有的表达式结果都为假,则执行else语句的语句段,分支结束。
{
	//语句段2
}
else if (表达式3)
{
	//语句段3
}
//...
else
{
	//语句段4
}

使用细节

1.在C语言中,表达式结果为 0 则为假,非 0 则为真。

#include <stdio.h>

int main()
{
	int num = 0;
	printf("请输入num的值:> ");
	scanf("%d", &num);
	if (num)
	{
		printf("真\n");
	}
	else
	{
		printf("假\n");
	}
	return 0;
}

2. if 语句默认生效于一条语句,若想让它作用于多条语句,需要加上大括号{}。

#include <stdio.h>

int main()
{
	int num = 0;
	printf("请输入num的值:> ");
	scanf("%d", &num);
	if (num != 0)
		printf("xixi\n");
		printf("haha\n");
	return 0;
}

#include <stdio.h>

int main()
{
	int num = 0;
	printf("请输入num的值:> ");
	scanf("%d", &num);
	if (num != 0)
	{
		printf("xixi\n");
		printf("haha\n");
	}
	return 0;
}

3.在同一作用域内,else子句会与离它最近的 if语句匹配。

#include <stdio.h>

int main()
{
	int num1 = 0;
	int num2 = 0;
	printf("请输入num1和num2的值:> ");
	scanf("%d %d", &num1, &num2);
	if (num1 != 0)
		if (num2 != 0)
			printf("xixi\n");
	else
		printf("haha\n");
	return 0;
}

#include <stdio.h>

int main()
{
	int num1 = 0;
	int num2 = 0;
	printf("请输入num1和num2的值:> ");
	scanf("%d %d", &num1, &num2);
	if (num1 != 0)
	{							//用 {} 将它们分隔在不同的域
		if (num2 != 0)
			printf("xixi\n");
	}
	else
		printf("haha\n");
	return 0;
}

4. if语句可以嵌套使用。

5.多分支 if 语句只会执行最先满足条件的一条分支。多个 if 语句时,每个 if 语句都会判断, 为真则执行。

#include <stdio.h>

int main()
{
	int age = 0;
	printf("请输入年龄:>");
	scanf("%d", &age);
	if (age >= 90)
	{
		printf("老寿星\n");
	}
	else if (age >= 60)
	{
		printf("老年\n");
	}
	else if(age >= 30)
	{
		printf("中年\n");
	}
	else if (age >= 18)
	{
		printf("青年\n");
	}
	else
	{
		printf("未成年\n");
	}
	return 0;
}

#include <stdio.h>

int main()
{
	int age = 0;
	printf("请输入年龄:> ");
	scanf("%d", &age);
	if (age >= 90)
	{
		printf("老寿星\n");
	}
	if (age >= 60)
	{
		printf("老年\n");
	}
	if(age >= 30)
	{
		printf("中年\n");
	}
	if (age >= 18)
	{
		printf("青年\n");
	}
	else
	{
		printf("未成年\n");
	}
	return 0;
}

switch 语句

switch 语句语法规则如下:

switch (整型表达式) //当switch语句表达式的结果等于某个case子句的整型常量表达式时,便从此case子
{                  //句开始执行
case 整形常量表达式:
	语句;             //在switch语句中没有办法直接实现分支,只能实现从哪个入口进,需要借助
	break;            //break来实现多分支,break作用是结束此分支语句
case 整形常量表达式:
	语句;
	break;
case 整形常量表达式:
	语句;
	break;
//...
default:            //default子句若不需要可以省略不写
	语句;
}

语法特性:

1.当switch语句表达式的结果等于某个case子句的整型常量表达式时,便从此case子句开始  执行。

2.每个case子句都是一个入口,case子句后必须跟一个整型常量表达式。

3.在switch语句中没有办法直接实现分支,只能实现从哪个入口进,需要借助break来实现多分支,break的作用是结束此分支语句。

4.所有的case子句都不满足进入条件时,就会执行default子句

5.default子句如果不需要可以省略不写。

6.每个switch语句中只能出现一条default子句,但是它可以出现在语句列表的任何位置。

示例如下: 

#include <stdio.h>
int main()
{
	int day = 0;
	printf("今天是星期几:> ");
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期日\n");
		break;
    default:
		printf("输入不合法\n");
		break;
	}
	return 0;
}

使用细节

1.在符合需求逻辑时可以利用switch语句中无法直接实现分支的特性来编程。

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

2.switch语句可以嵌套使用。

#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");
		int num = 0;
		scanf("%d", &num);
		switch (num)
		{
		case 1:
			printf("打篮球\n");
			break;
		case 2:
			printf("打乒乓球\n");
			break;
		default:
			printf("复习\n");
			break;
		}
		break;
	}
	return 0;
}

循环语句

        C语言的循环语句有三种。分别是 while 循环语句do....while() 循环语句for 循环语句,其中while语句和for语句的使用场景更加普遍。

while 语句

while语句语法规则如下:

while (表达式) //表达式为真则执行循环语句段,直到表达式为假,终止循环。
{
	//循环语句段
}

示例如下:

#include <stdio.h>
int main()
{
	int num = 0;

	while (num < 10)
	{
		printf("%d ", num);
		++num;
	}
	printf("\n");
	return 0;
}

使用细节

1. while循环语句只要表达式结果为真,就会执行循环语句段,因此在while语句内一定要有调整循环变量的语句,使得表达式结果不会永远为真,以防止程序陷入死循环。

#include <stdio.h>
int main()
{
	int num = 0;
	//死循环
	while (num < 10)
	{
		printf("%d ", num);
		//++num;
	}
	printf("\n");
	return 0;
}

do...while() 语句

do...while() 语句与 while 语句很类似,区别就是do...while() 语句不管表达式结果是否为真都会先执行一遍循环语句段,即循环至少执行一次。语法规则如下:

do
{
	//循环语句段;

} while (表达式);

示例如下:

#include <stdio.h>
int main()
{
	int num = 0;

	do
	{
		printf("%d ", num);
		++num;
	} while (num < 10);

	printf("\n");
	return 0;
}

使用细节同while语句。

for 语句

for语句的使用场景最为普遍,语法规则如下:

for (表达式1(初始化);表达式2(条件判断);表达式3(调整部分))
{
	//循环语句段;
}

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

表达式2为条件判断部分,用于判断循环是否终止。

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

表达式用  ;  分隔。

表达式1即初始化只会执行一次,表达式3即调整部分在循环语句段执行完后才会执行

示例如下:

#include <stdio.h>
int main()
{
	int num;

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

	printf("\n");
	return 0;
}

使用细节

1.非必要情况下,不要在for语句循环体内修改循环控制变量,以防止循环失去控制。

#include <stdio.h>
int main()
{
	int num;

	for (num = 0; num < 10; num++)
	{
        //陷入死循环
		num = 1;
		printf("%d ", num);
	}

	printf("\n");
	return 0;
}

2.循环语句可以嵌套使用。

3.for循环中的初始化部分,判断部分,调整部分都是可以省略的,但是不建议初学时省略,容易导致问题。

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;

	for (i = 0; i < 10; i++)
	{
		//不省略初始化
		for (j = 0; j < 10; j++)
		{
			printf("%d ", j);
		}
		printf("\n");
	}

	return 0;
}

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;

	for (i = 0; i < 10; i++)
	{
		//省略初始化
		for (; j < 10; j++)
		{
			printf("%d ", j);
		}
		printf("\n");
	}

	return 0;
}

4.循环控制变量可以有多个。

#include <stdio.h>

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}

	return 0;
}

转向语句 

        为了使C语言更加的灵活,祖师爷引入了转向语句。像break语句continue语句return语句goto语句都是转向语句。

break 语句

        break 语句用于分支语句和循环语句中,在分支语句中常与 switch语句搭配使用,在循环语句中的作用是强制永久终止本层循环(只能终止一层循环)。

#include <stdio.h>

int main()
{
	//while循环语句
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i);
		i++;
	}
	printf("\n");

	//do...while()循环语句
	int j = 0;
	do
	{
		if (j == 5)
		{
			break;
		}
		printf("%d ", j);
		j++;
	} while (j < 10);
	printf("\n");

	//for循环语句
	for (i = 0; i < 10; i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i);
	}
	printf("\n");

	return 0;
}

continue 语句 

        continue 语句用于循环语句,其作用是跳过本次循环,即跳过continue语句后面的代码直接回到条件判断部分。

        由于while循环语句do...while()语句循环调整部分语句也在循环体内因此在这两个语句中使用continue语句时要格外注意,防止跳过循环调整部分的语句,否则程序会陷入死循环。for循环语句的调整部分不在循环体内,因此不用担心这个问题。

#include <stdio.h>

int main()
{
	//while循环语句
	int i = 0;
	while (i < 10)
	{
		//死循环
		if (i == 5)
		{
			printf("%d ", i);
			continue;
		}
		printf("%d ", i);
		i++;
	}
	printf("\n");
	return 0;
}

#include <stdio.h>

int main()
{
	//while循环语句
	int i = 0;
	while (i < 10)
	{
		if (i == 5)
		{
			//printf("%d ", i);
			i++;
			continue;
		}
		printf("%d ", i);
		i++;
	}
	printf("\n");
	return 0;
}

#include <stdio.h>

int main()
{
	int i = 0;
	//for循环语句
	for (i = 0; i < 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	printf("\n");

	return 0;
}

return 语句

return 语句用来结束函数。main函数中return 0;表示程序正常结束(规定)。

goto 语句 

goto语句作用是跳转到你想要去的任何地方语法规则如下:

标号:

	//...

goto 标号;

示例如下:

#include <stdio.h>
int main()
{
	int i = 0;
begin:
	printf("%d ", i);
	i++;
	if (i < 10)
	{
		goto begin;
	}
	printf("\n");
	return 0;
}

使用细节

        在上文中我们讲到C语言是一门结构化的程序设计语言,由于goto语句用起来百无禁忌,不仅与C语言的结构化理念背道而驰,而且goto语句的滥用可能会引发各种各样的bug,从理论上来说goto语句也是没有必要的,实践中即使没有goto语句也可以很容易的写出代码。当然,在某些场景下goto语句还是有优势的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。比如:一次性跳出多层循环

#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	//for循环语句
	for (i = 0; i < 10; i++)
	{
		printf("xixi ");
		for (j = 0; j < 10; j++)
		{
			if (j == 2)
			{
				goto begin;
			}
			printf("haha ");
		}
		printf("\n");
	}
begin:
	printf("\n");

	return 0;
}

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

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

相关文章

MVCC中的可见性算法

在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理&#xff08;read viewundo log&#xff09;&#xff0c;今天来详细的说一下readview的匹配规则&#xff08;可见性算法&#xff09; 隔离级别在RC&#xff0c;RR的前提下 Read View是如何保证可见性判断的呢&#…

微服务-grpc

微服务 一、微服务&#xff08;microservices&#xff09; 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么&#xff0c;什么是微服务 呢&#xff1f;微服务的概念是怎么产生的呢&#xff1f; 我们就来了解一下Go语言与微服务的千丝…

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…

Unity地面交互效果——4、制作地面凹陷轨迹

大家好&#xff0c;我是阿赵。   上一篇介绍了曲面细分着色器的基本用法和思路&#xff0c;这一篇在曲面细分的基础上&#xff0c;制作地面凹陷的轨迹效果。 一、思路分析 这次需要达到的效果是这样的&#xff1a; 从效果上看&#xff0c;这个凹陷在地面下的轨迹&#xff0…

BigDecimal使用的时候需要注意什么?

BigDecimal只要涉及到浮点数运算都会用到BigDecimal&#xff0c;并且面试的时候经常会问到&#xff0c;那么BigDecimal使用的时候需要注意什么&#xff1f; 目录 1.为什么不能用浮点数表示金额&#xff1f;2.十进制转换二进制3.科学记数法4.IEEE 7545.在线浮点数转换二进制6.原…

Go uuid库介绍

简介&#xff1a; 在现代软件开发中&#xff0c;全球唯一标识符&#xff08;UUID&#xff09;在许多场景中发挥着重要的作用。UUID是一种128位的唯一标识符&#xff0c;它能够保证在全球范围内不重复。在Go语言中&#xff0c;我们可以使用第三方库github.com/google/uuid来方便…

怎样在iOS手机上进行自动化测试

Airtest支持iOS自动化测试&#xff0c;在Mac上为iOS手机部署iOS-Tagent之后&#xff0c;就可以使用AirtestIDE连接设备&#xff0c;像连接安卓设备一样&#xff0c;实时投影、控制手机。iOS测试不仅限于真机测试&#xff0c;iOS模拟器也可以进行。Mac端上部署完成后还可以提供给…

python-re模块

python之正则表达式-基础匹配https://blog.csdn.net/Python_1981/article/details/133777795python之正则表达式-元字符匹配https://blog.csdn.net/Python_1981/article/details/133778805 一、查找 1、findall 2、search 如果没有匹配到&#xff0c;会返回None, 使用group会报…

大文件传输小知识 | UDP和TCP哪个传输速度快?

在网络世界中&#xff0c;好像有两位“传输巨头”常常被提起&#xff1a;UDP和TCP。它们分别代表着用户数据报协议和传输控制协议。那么它们是什么&#xff1f;它们有什么区别&#xff1f;它们在传输大文件时的速度又如何&#xff1f;本文将深度解析这些问题&#xff0c;帮助企…

基于若依的ruoyi-nbcio流程管理系统仿钉钉流程json转bpmn的flowable的xml格式(简单支持发起人与审批人的流程)续

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前生产的xml&#xff0c;在bpmn设计里编辑有些内容不正确&#xff0c;包括审批人&#xff0c;关联表单等…

利用python找出偏序集中极大元、极小元、最大元和最小元

1 问题 在离散数学“关系”这一章的学习过程中&#xff0c;学到偏序集中极大元、极小元、最大元和最小元的求解方法&#xff0c;于是提出能不能用python语言实现偏序集中极大元、极小元、最大元和最小元的求解&#xff1f; 2 方法 判断偏序集中的极大元、极小元、最大元和最小元…

Java TCP服务端多线程接收RFID网络读卡器上传数据

本示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; impor…

Vue路由介绍及使用

一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现&#xff0c;当切换不同的功能时&#xff0c;页面不会进行刷新&#xff0c;类似Ajax请求&#xff0c;但请求地址会发生部分变化。 2.具体示例 单…

微型计算机原理1

一、选择题 1.8086CPU的字长是&#xff08;&#xff09;位。 A. 32 B. 128 C. 64 D. 16 2 间接寻址方式中&#xff0c;操作数在(&#xff09;中。 A. 通用寄存器 B. 内存单元 C. 程序计数器 D.堆栈 3.在循环指令LOOP和串操作指令中,用作计数器的寄存器是() A. AX B. BX C. C…

深度学习(CNN+RNN)笔记1

文章目录 视频课 第四课&#xff1a;卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第一周&#xff1a;Convolutional Neural Networks 卷积神经网络第二周&#xff1a;Case Studies 案例学习第三周&#xff1a;Object Detection 目标检测第四周&#xff…

Jupyter Notebook快速上手

Jupyter Notebook快速上手 文章目录 Jupyter Notebook快速上手1 运行Jupyter Notebook1.1 通过图形化界面打开1.2 通过命令行打开1.3 在指定项目目录下打开 2 Jupyter Notebook运行后无法自动打开网页3 Jupyter Notebook运行代码没反应4 退出4.1 终端退出4.2 命令行退出 此教程…

[PHP]ShopXO企业级B2C免费开源商城系统 v2.3.1

ShopXO 企业级B2C免费开源电商系统&#xff01; 求实进取、创新专注、自主研发、国内领先企业级B2C电商系统解决方案。 遵循Apache2开源协议发布&#xff0c;无需授权、可商用、可二次开发、满足99%的电商运营需求。 PCH5、支付宝小程序、微信小程序、百度小程序、头条&抖音…

Chrome插件精选 — 屏幕录像插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. 屏幕录像机 - S…

Java GC机制 —— 个人笔记

文章目录 JVM内存区对象是否需要回收&#xff1f;1. 引用计数法2. 可达性分析法&#xff08;根搜索算法&#xff09;Java的引用 对象何时被回收&#xff1f;回收策略回收策略1&#xff1a;引用计数算法回收策略2&#xff1a;标记清除算法&#xff08;Mark-Sweep&#xff09;回收…

MySQL 8.0 Clone Plugin 详解

文章目录 前言1. 克隆插件安装2. 克隆插件的使用2.1 本地克隆2.2 远程克隆 3. 克隆任务监控4. 克隆插件实现4.1 Init 阶段4.2 File Copy4.3 Page Copy4.4 Redo Copy4.5 Done 5. 克隆插件的限制6. 克隆插件与 Xtrabackup 的异同7. 克隆插件相关参数后记 前言 克隆插件&#xff…