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.mzph.cn/diannao/18167.shtml

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

相关文章

寒冬来了,字节跳动开启裁员新模式。。

大家好&#xff0c;我是白露啊。 不得不说&#xff0c;字节跳动还是真的会搞事啊。 最近一段时间&#xff0c;字节搞出了一个裁员新模式&#xff1a;“细水长流”。这个寓意和“财&#xff08;裁&#xff09;源&#xff08;员&#xff09;广进”计划差不多了&#xff0c;只不…

python如何巧妙地利用内置函数与列表切片组织舞会派对

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、问题分析 三、解决方案 1. 利用内置函数创建参会人员名单 2. 利用列表切片…

Redis 事件机制 - AE 抽象层

Redis 服务器是一个事件驱动程序&#xff0c;它主要处理如下两种事件&#xff1a; 文件事件&#xff1a;利用 I/O 复用机制&#xff0c;监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端&#xff08;或其他Redis 服务器&#xff09;发送网络请求触发。时间事件&am…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

【计算机视觉(4)】

基于Python的OpenCV基础入门——色彩空间转换 色彩空间简介HSV色彩空间GRAY色彩空间色彩空间转换 色彩空间转换代码实现: 色彩空间简介 色彩空间是人们为了表示不同频率的光线的色彩而建立的多种色彩模型。常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV、GRAY&#xff0c;其中最…

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境&#xff1a;Matlab2014b 部分代码&#xff1a; %% 视频流循环处理 % 创建一个循环过程来对给定视频进行车道线检测 % 该循环使用之前初始化的系统对象 warningTextColors {[1 0 0], [1 0 0], [0 0 0], [0 0 0]}; while ~isDone(hVideoSrc) RGB step(hVideoSrc);% …

SpringBoot使用redis结合mysql数据库(黑名单)渲染商品详情界面

目录 一、界面效果 二、前端代码 三、后端代码&#xff08;redisblacklist&#xff09; 3.1 ProducatController 3.2 ProductService 3.3 ProductDao 3.4 映射文件 一、界面效果 二、前端代码 商品详情前端代码 <template><van-nav-bartitle"商品详情&quo…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题&#xff1a;使用Jackson将一个超级大的JSON字符串转换POJO失败&#xff0c;debug看没问题&#xff0c;将JSON字符串粘贴到main方法中测试&#xff0c;提示错误信息如下&#xff1a; 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

微服务架构-分支微服务设计模式

微服务架构-分支微服务设计模式 这种模式是聚合器模式的扩展&#xff0c;允许同时调用两个微服务链 分支微服务设计模式是一种用于构建大型系统的微服务架构模式&#xff0c;其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统&#xff0c;每个子系统由一个或多…

unity制作app(10)--统一字体

1.载入字体&#xff0c;微软雅黑&#xff0c;需要3分钟左右 加载进来3个 2.font文件夹下创建一个txt&#xff0c;内部的内容如下&#xff1a; &#xfeff;啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏…

word如何创造新的格式标题

1 效果如下&#xff1a;&#xff08;标题命名默认音序排序&#xff09; 2 创建 选中自己喜欢的标题&#xff0c;修改字号字体&#xff0c;then 3 修改 注意要点如下&#xff1a; 后续&#xff1a;以上操作可能导致后续一级标题不能折叠二级标题&#xff0c;目录导航栏也不能…

C++网络编程——socket

在服务器中&#xff0c;需要建立一个socket套接字才能对外提供一个网络通信接口&#xff0c;在Linux系统中套接字仅是一个文件描述符&#xff0c;也就是一个int类型的值 socket概念 socket 的原意是“插座”&#xff0c;在计算机通信领域&#xff0c;socket 被翻译为“套接字…

OpenStack创建云主机——超级详细步骤

四、创建云主机 一台云主机成功创建或启动需要依赖OpenStack中的各种虚拟资源&#xff0c;如CPU、内存、硬盘等。如果需要云主机丽娜姐外部网络&#xff0c;还需要网络、路由器等资源。如果需要外部网络访问云主机&#xff0c;那么还需要配置浮动IP。因此&#xff0c;在创建云主…

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单&#xff0c;并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态&#xff08;HTTP/SMTP等协议&#xff09;、远程主机、服务器资源变化等等。…

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

一款基于UniappFastAdminThinkPHP开发的旅游系统&#xff0c;包含消费者端&#xff08;手机端&#xff09;、机构工作人员&#xff08;手机端&#xff09;、机构端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&#xff09;。机构可以发布旅游线路、景点项目&#xff…

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

Linux——多线程(一)

一、线程的概念 1.1线程概念 教材中的概念&#xff1a; (有问题?) 线程是进程内部的一个执行分支&#xff0c;线程是CPU调度的基本单位 之前我们讲的进程&#xff1a; 加载到内存中的程序&#x…

栈的特性及代码实现(C语言)

目录 栈的定义 栈的结构选取 链式储存结构和顺序栈储存结构的差异 栈的代码实现 "stack.h" "stack.c" 总结 栈的定义 栈&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表。 我们把运行插入的和删除的一段叫做栈顶&#xff08;TOP&#xff…

【JVM】一次JVM内存泄露分析处理

一次内存泄露分析 背景情况 编写了一个大数据基础组件的可用性监控程序&#xff0c;采用Bootstrap监测端口的方式&#xff0c;使得方法常驻&#xff08;main线程常驻&#xff09;&#xff0c;通过一个调度线程ScheduledThreadPoolExecutor&#xff0c;定时的调动监测任务。 …

adb获取包名和界面名

adb获取包名和界面名 mac adb shell dumpsys window windows | grep mFocusedApp windows adb shell dumpsys window windows | findstr mFocusedApp 这个是在当前手机打开哪个界面获取的就是哪个界面的包名与界面 注意第一次连接时会有提示&#xff0c;需要连接两次才可以 …