C语言学习笔记之结构篇

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

景联文科技提供高质量人像采集服务,助力3D虚拟人提升逼真度

人像采集是一种通过特定设备或技术&#xff0c;对人的相貌、身材等特征信息进行收集和处理的过程&#xff0c;可应用于3D虚拟人领域。通过采集大量的人像数据&#xff0c;可以训练和优化人像识别算法&#xff0c;提高其准确性。 人像采集对于提高3D虚拟人的逼真度、个性化定制以…

【手把手教你】将python程序打包成exe可执行文件

1. 安装环境 pip install pyinstaller6.0.02. 打包文件 pyinstaller -D “要启动的文件名“.py比如我的命令就是&#xff1a;pyinstaller -D eval.py 执行完后&#xff0c;会生两个文件夹dist和bulib两个文件和一个xxx.spec文件 3. 删除生成的文件 删除生成的bulid和dist文…

Java学习 8.Java-递归

一、递归的概念 引例&#xff1a; 一个方法在执行过程中调用自身&#xff0c;就称为递归&#xff08;函数自己调用自己&#xff09; 递归相当于数学的数学归纳法&#xff0c;有一个起始条件&#xff0c;有一个递推公式 递归的必要条件 1.将原问题划分为子问题&#xff0c;…

使用数据分析,识别设备异常

设备健康监测系统在工业领域中扮演着至关重要的角色&#xff0c;它能够帮助企业及时发现设备异常&#xff0c;预防故障&#xff0c;提高设备使用寿命和生产效率。而异常诊断技术则是设备健康监测系统中的核心部分&#xff0c;能够实现对设备异常情况的准确判断。根据设备状态数…

AI:69-基于深度学习的音乐推荐

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

命令行远程操作windows

如遇安装python模块问题&#xff0c;请参考此连接处理&#xff1a;http://t.csdnimg.cn/l9W6f 一、命令行中使用ssh连接 1、安装 OpenSSH 客户端&#xff1a; 在 Windows 10 中&#xff0c;打开“设置”应用&#xff0c;选择“应用” > “可选功能” > “添加功能”。…

python- os模块

一、文件与目录相关的操作 1、删除文件/文件夹 2、os.stat("path/filename"): 获取文件/目录信息的结构说明 3、os.listdir 和 os.path.join 在Python中&#xff0c;os.listdir()和os.path.join()是操作系统模块&#xff08;os模块&#xff09;的两个函数&#x…

机器学习——奇异值分解案例(图片压缩未开始)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

Python Opencv实践 - 车牌定位(纯练手,存在失败场景,可以继续优化)

使用传统的计算机视觉方法定位图像中的车牌&#xff0c;参考了部分网上的文章&#xff0c;实际定位效果对于我目前使用的网上的图片来说还可以。实测发现对于车身本身是蓝色、或是车牌本身上方有明显边缘的情况这类图片定位效果较差。纯练手项目&#xff0c;仅供参考。代码中im…

学之思开源考试系统部署至Centos7

学之思开源考试系统部署至Centos7 1、下载源码 源码下载&#xff1a; https://gitee.com/mindskip/xzs-mysql 数据库脚本下载&#xff1a; https://www.mindskip.net:999/ 2、项目打包 分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录&#xff0c;执行前端打…

【遮天】叶凡首次高燃时刻,暴打姜峰逼其下跪,故事逐渐燃情

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《遮天》国漫30集剧情最新内容解析&#xff0c;前面剧情中&#xff0c;叶凡被姜峰如疯狗一般追杀&#xff0c;他像一只被狼群追逐的鹿&#xff0c;在山林中亡命逃窜。身后是姜峰那歇斯底…

KaiOS APN配置文件apn.json调试验证方法(无需项目全编)

1、KaiOS 的应用就类似web应用&#xff0c;结合文件夹路径webapp字面意思理解。 2、KaiOS APN配置文件源代码在apn.json&#xff0c; &#xff08;1&#xff09;apn.json可以自定义路径&#xff0c;通过配置脚本实现拷贝APN在编译时动态选择路径在机器中生效。 &#xff08;…

Ubuntu22.04安装MySql

在Ubuntu上安装mysql就比较简单了 1、常规操作&#xff0c;更新软件包列表 apt update 至少安装之前看一眼版本吧 apt list mysql-server 嗯&#xff0c;是8.0.35版本的 2、安装mysql apt install mysql-server 3、给root用户设置密码 # 第一次安装完无需密码,让你输入…

【C语言】嵌套结构体初始化 - 一个有趣的结论

0. 前言 A. 嵌套结构体&#xff08;比如双链表&#xff09;的初始化一般是什么流程&#xff1f; B. 嵌套结构体的内存是如何分布的&#xff1f; C. 结构体中的结构体指针是否需要再次分配内存&#xff1f;不分配会怎么样&#xff1f; 关于嵌套结构体的初始化问题&#xff0c;我…

华为H12-831题库

单选&#xff09;当IS-IS网络中有多条冗余链路时&#xff0c;可能会出现多条等价路由。关于IS-IS网络内的等价路由&#xff0c;以下哪个描述是错误的? A、当组网中存在的等价路由数量大于通过命令配置的数量&#xff0c;且这些路由优先级相同时&#xff0c;优选下一跳设备Sys…

基于springboot 停车场管理系统-计算机毕设 附源码 39315

spring boot停车场管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。…

外包干了2个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Linux - 进程程序替换 - C/C++ 如何实现与各个语言之间的相互调用 - 替换环境变量

前言 我们之前利用 fork&#xff08;&#xff09;函数来创建子进程&#xff0c;这种方式是 父子进程 共用一个代码&#xff0c;只是在代码当中使用了 if-else 语句来分流&#xff0c;达到父子进程运行不同的代码块的目的。但是其实本质上&#xff0c;还是父子共用一个代码和数…

前端-第一部分-HTML

一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language&#xff0c;翻译为超文本标签语言&#xff0c;标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一&#xff0c;也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…

spring 中 @Validated/@Valid

超级好的链接 添加链接描述