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");elseprintf("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");}elseprintf("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.rhkb.cn/news/183913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot项目中通过 Jasypt 对属性文件中的账号密码进行加密

下面是在Spring Boot项目中对属性文件中的账号密码进行加密的完整步骤&#xff0c;以MySQL的用户名为root&#xff0c;密码为123321为例&#xff1a; 步骤1&#xff1a;引入Jasypt依赖 在项目的pom.xml文件中&#xff0c;添加Jasypt依赖&#xff1a; <dependency><…

ClickHouse 学习之从高级到监控以及备份(二)

第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…

ubuntu 20.04 server安装

ubuntu 20.04 server安装 ubuntu-20.04.6-live-server-amd64.iso 安装 安装ubuntu20.04 TLS系统后&#xff0c;开机卡在“A start job is running for wait for network to be Configured”等待连接两分多钟。 cd /etc/systemd/system/network-online.target.wants/在[Servi…

揭开堆叠式自动编码器的强大功能

一、介绍 在不断发展的人工智能和机器学习领域&#xff0c;深度学习技术因其处理复杂和高维数据的能力而广受欢迎。在各种深度学习模型中&#xff0c;堆叠式自动编码器是一种多功能且功能强大的工具&#xff0c;可用于特征学习、降维和数据表示。本文探讨了堆叠式自动编码器在深…

R语言实操记录——导出高清图片(矢量图)

R语言 R语言实操记录——导出高清图片&#xff08;矢量图&#xff09; 文章目录 R语言一、起因&#xff08;闲聊&#xff0c;可跳过&#xff09;二、如何在R中导出高清图片&#xff08;矢量图&#xff09;2.1、保存为EPS图片格式后转AI编辑2.2、保存为PDF格式&#xff08;推荐…

LabVIEW实现变风量VAV终端干预PID控制

LabVIEW实现变风量VAV终端干预PID控制 变风量&#xff08;VAV&#xff09;控制方法的研究一直是VAV空调研究的重点。单端PID控制在温差较大时&#xff0c;系统容易出现过冲。针对空调终端单端PID控制的不足&#xff0c;设计一种干预控制与PID控制耦合的控制方法。项目使用LabV…

关于Alibaba Cloud Toolkit 下载配置以及后端自动部署

idea中File-Settings-Plugins 搜索Alibaba Cloud Toolkit点击下载&#xff0c;下载完成重启 1、点击 Tools-Alibaba Cloud-Deploy to Host 部署到主机 2、配置服务器ip、jar包启动命令、服务器jar存放位置 3、设置服务器ip用户名密码&#xff0c;点击测试连接情况 4、配置脚本…

Flink SQL TopN语句详解

TopN 定义&#xff08;⽀持 Batch\Streaming&#xff09;&#xff1a; TopN 对应离线数仓的 row_number()&#xff0c;使⽤ row_number() 对某⼀个分组的数据进⾏排序。 应⽤场景&#xff1a; 根据 某个排序 条件&#xff0c;计算 某个分组 下的排⾏榜数据。 SQL 语法标准&am…

基于Java+SpringBoot+LayUI仓库管理系统

一.项目介绍 本项目是使用JavaSpringBoot开发&#xff0c;可以实现仓库的注册、登录&#xff0c;登录后可进入系统&#xff0c;进行客户管理、供应商管理、商品管理、商品退货查询管理、登录日志及退出等几大模块。系统界面采用传统的后台管理界面&#xff0c;界面简单、直观。…

【大数据】NiFi 中的处理器(一):GenerateTableFetch

NiFi 中的处理器&#xff08;一&#xff09;&#xff1a;GenerateTableFetch 1.简介2.应用场景3.示例3.1 案例一&#xff1a;无输入流文件&#xff0c;来源表含增量字段3.2 案例二&#xff1a;无输入流文件&#xff0c;不含增量字段3.3 案例三&#xff1a;无输入流文件&#xf…

Transformer的最简洁pytorch实现

目录 前言 1. 数据预处理 2. 模型参数 3. Positional Encoding 4. Pad Mask 5. Subsequence Mask 6. ScaledDotProductAttention 7. MultiHeadAttention 8. FeedForward Networks 9. Encoder Layer 10. Encoder 11. Decoder Layer 12. Decoder 13. Transformer 1…

【单片机基础小知识-如何通过指针来读写寄存器】

寄存器的本质就是内存&#xff0c;RAM&#xff0c;而指针是可以对内存进行操作的&#xff0c;因此可以通过指针来读写寄存器。 如何读取以下一片地址&#xff1a; 步骤1、首地址 结构体&#xff0c;它所占用的内存空间大小与它内部成员有关。 构造一个28字节的类型 type…

计算机服务器中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

随着网络技术的不断成熟&#xff0c;网络中存在的病毒威胁也不断增多&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器数据库遭到了勒索病毒攻击&#xff0c;并且勒索病毒的攻击与加密形式也发生了许多变化。其中攻击次数较…

python对Windows如何进行关机/重启?

用CMD命令进行关机/重启步骤&#xff1a; 1.winR&#xff0c;换出输入框 2.在输入框输入命令&#xff0c;如关机&#xff1a;shutdown -s -t 20&#xff0c;该命令是20秒后关机。 命令说明 -s 关机 -r 重启 -t 时间&#xff0c;后面是数字是你要设置的秒数 -a 取消命令&…

bilibili快速升满级(使用Docker 容器脚本)

部署bilibili升级运行容器脚本 docker run --name"bili" -v /bili/Logs:/app/Logs -e Ray_DailyTaskConfig__Cron"30 9 * * *" -e Ray_LiveLotteryTaskConfig__Cron"40 9 * * *" -e Ray_UnfollowBatchedTaskConfig__Cron"…

​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】 课本里章节里所有蓝色字体的思维导图

安防监控EasyCVR视频汇聚平台使用海康SDK播放时,画面播放缓慢该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…

node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用

文章目录 前言一、express使用中间件body-parser获取请全体的数据1. 代码2. 效果 二、express使用ejs&#xff08;了解即可&#xff09;1.安装2.作用3.基本使用&#xff08;1&#xff09;代码&#xff08;2&#xff09;代码分析和效果 4.列表渲染&#xff08;1&#xff09;代码…

【算法| 差分 No.1】AcWing 797. 差分 AcWing 798. 差分矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家有所帮…

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现SVM-Adaboost时间序列预测&#xff08;风…