C语言基础(五)【控制语句与循环(上)学习篇】

文章目录

  • 前言
  • 一、if - else 语句
  • 二、switch-case 语句
  • 三、while 循环
  • 四、for 循环
  • 五、do - while 循环
  • 六、break 语句
  • 七、continue 语句
  • 八、go to 语句
  • 总结


前言

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,因此提供了多种控制语句和循环结构,用于控制程序的执行流程。


一、if - else 语句

1. if 语句的一般语法形式如下: \colorbox{PowderBlue}{1. if 语句的一般语法形式如下:} 1. if 语句的一般语法形式如下:

if ( 表达式 )语句1
else语句2

表达式成立(为真),则语句1执行,表达式不成立(为假),则语句执行表达式2。

在C语言中,0 为假,非 0 表示真,也就是表达式的结果如果是 0,则语句不执行,表达式的结果如果是不是 0,则语句执行。


2. if - else 语句一般的流程图 \colorbox{PowderBlue}{2. if - else 语句一般的流程图} 2. if - else 语句一般的流程图

在这里插入图片描述


3. 分支中包含多条语句 \colorbox{PowderBlue}{3. 分支中包含多条语句} 3. 分支中包含多条语句

(1). 默认在 if 和 else 语句中默认都只控制一条语句

示例1:

int a = 10;
int b = 20;
if (a < b)printf("%d < %d\n", a, b);printf("1\n");

输出结果:
在这里插入图片描述


但是当 b 为 5,a < b为假时,a < b 不成立,但第二条语句还是执行了
在这里插入图片描述
可以发现到不管是 a < b,a > b还是 a = b,1 都会打印在屏幕上

注意:这是因为 if 语句默认只能控制一条语句,就是 printf(“1\n”); ,if 语句为真,则打印 10 < 20,if语句为假,则不打印,对于 printf(“1\n”); 是独立存在的,不管 if 语句的条件的是真还是假,都会被执行。

如果要让 if 语句同时控制多条语句,就要使用 {} 将代码括起来,else 后也可以跟上大括号 {}。


示例2:

	int a = 10;int b = 5;if (a < b){printf("%d < %d\n", a, b);printf("1\n");}

输出结果:
在这里插入图片描述
因为 a < b,if 里面的条件不成立,则大括号里的代码不执行。


4. 嵌套 if \colorbox{PowderBlue}{4. 嵌套 if} 4. 嵌套 if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断。

示例3:输入一个整数,如果是正数,再判断是奇数还是偶数。

int num = 0;
scanf("%d", &num);
if (num > 0)
{if (num % 2 == 0)printf("偶数\n");elseprintf("奇数\n");
}
else
{printf("负数\n");
}

输出结果1:
在这里插入图片描述


输出结果2:
在这里插入图片描述


5. 悬空 else 问题 \colorbox{PowderBlue}{ 5. 悬空 else 问题}  5. 悬空 else 问题

如果有多个 if 和 else ,存在这样一条规则, else 总是跟最接近的 if 匹配

示例1:

int a = 0;
int b = 3;
if (a == 1)if (b == 3)printf("1\n");
elseprintf("2\n");

输出结果:
在这里插入图片描述
运行结果是:程序什么也没输出。


示例2:上面示例1可以理解为下面这段代码。

int a = 0;
int b = 2;
if (a == 1)
{if (b == 2)printf("1\n");elseprintf("2\n");
}

注意:这段代码中的 else 实际上与第二个 if 语句匹配,而不是第一个由于第一个 if 条件不成立(a 不等于 1),整个嵌套的 if - else 结构都不会执行,因此程序不会输出任何内容。
简而言之,由于第一个 if 条件为假,导致后面的 if - else 结构被跳过,所以程序不会打印任何东西。


6. if 语句多条件判断:if-else if-else结构的使用 \colorbox{PowderBlue}{6. if 语句多条件判断:if-else if-else结构的使用} 6. if 语句多条件判断:if-else if-else结构的使用

使用这个可以根据不同的条件执行不同的代码块。

示例1:

int a = 10;
int b = 20;
if (a < b) 
{// 如果 a < b 为真,则执行这里的代码printf("%d < %d\n", a, b);
}
else if (a > b) 
{// 如果 a < b 为假且 a > b 为真,则执行这里的代码printf("%d > %d\n", a, b);}
else 
{// 如果 a < b 和 a > b 都为假,则执行这里的代码printf("%d = %d\n", a, b);}

二、switch-case 语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它可以把多重的 else if 改成更易用、可读性更好的形式。

1. Switch 语句的语法形式 \colorbox{PowderBlue}{1. Switch 语句的语法形式} 1. Switch 语句的语法形式

switch (expression) {// 如果 expression 等于 value1,执行这里的代码case value1: statement1break;// 如果 expression等于 value2,执行这里的代码case value2: statement2break;// ...可以有多个case// 如果 expression 不等于任何 case 的值,执行这里的代码default: statement3
}

上面代码根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。


注意:1. switch 后的 expression 必须是整型表达式。
2. case 后的值,必须是整形常量表达式。
3. case 和后边的数字之间必须有空格。
4. 每一个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个 switch语句。


2. Switch 语句的流程图 \colorbox{PowderBlue}{2. Switch 语句的流程图} 2. Switch 语句的流程图
在这里插入图片描述


3. Switch 语句中的 break 和 default 的作用 \colorbox{PowderBlue}{3. Switch 语句中的 break 和 default 的作用} 3. Switch 语句中的 break  default 的作用

  1. switch 中的 break(下面会讲解 break 语句的作用)。

示例1:输入任意一个整数值,计算除 3 之后的余数。

int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:printf("整除,余数为0\n");break;
case 1:printf("余数是1\n");break;
case 2:printf("余数是2\n");break;
}

输出结果1:
在这里插入图片描述


在这里插入图片描述


如果去掉 case 语句中的 break。

示例2:

int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:printf("整除,余数为0\n");
case 1:printf("余数是1\n");
case 2:printf("余数是2\n");
}

输出结果2:
在这里插入图片描述


注意:switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。


  1. switch 中的 default

在使用 switch 语句的时候,可能会遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候就要不得不做处理,在 switch 语句中加入 default 子句。

示例1:输入星期,输出是工作日还是休息日。

int day = 0;
scanf("%d", &day);switch (day)
{case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("输入错误");break;
}

输出结果:
在这里插入图片描述


注意:在 switch 语句中 case 语句和 default 语句其实是没有顺序要求的,只要确保当前写的顺序是可以满足实际需求的就可以。不过通常是把 default 子句放在最后处理的。


三、while 循环

1. while 循环的语法形式 \colorbox{PowderBlue}{1. while 循环的语法形式} 1. while 循环的语法形式

while (表达式) {// 循环体// 这是一段代码块,只要条件(表达式)为真,就会不断执行
}

这里的表达式是一个布尔表达式,它在每次循环开始之前都会被检查。如果表达式的值为真(即非零),循环体中的代码就会执行。循环体执行完毕后,控制流回到 while语句,再次检查条件。这个过程会一直重复,直到条件变为假(零)或一直循环下去。


2. while 循环的流程图 \colorbox{PowderBlue}{2. while 循环的流程图} 2. while 循环的流程图
在这里插入图片描述


3. while 循环的实践 \colorbox{PowderBlue}{3. while 循环的实践} 3. while 循环的实践

示例:在屏幕上打印1~10的值。

int i = 1;
while (i <= 10)    // 当 i 的值小于或等于 10,循环就会继续执行。
{printf("%d ", i);i = i + 1;
}

输出结果:
在这里插入图片描述


注意:while 循环结构比较适合于那些需要在不确定次数内重复执行某段代码的场景。


四、for 循环

1. for 循环的语法形式 \colorbox{PowderBlue}{1. for 循环的语法形式} 1. for 循环的语法形式

for (初始化表达式;条件表达式;更新表达式) {// 循环体// 这是一段代码块,只要条件表达式为真,就会不断执行
}

初始化表达式: 用于循环变量的初始化。
条件表达式 :用于循环结束条件的判断。
更新表达式 :用于循环变量的调整。

循环开始时,首先初始化循环变量(初始化表达式)。然后不断检查条件(条件表达式),若条件为真(非0),则执行循环体,接着更新循环变量(更新表达式),并重复此过程。若条件为假(0),则循环终止。

简而言之,循环变量仅初始化一次,之后循环根据条件持续执行,直至条件不再满足。


2. for 循环的流程图 \colorbox{PowderBlue}{2. for 循环的流程图} 2. for 循环的流程图
在这里插入图片描述


3. for 循环的实践 \colorbox{PowderBlue}{3. for 循环的实践} 3. for 循环的实践

示例:在屏幕上打印1~10的值。

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

输出结果:
在这里插入图片描述


注意: for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分比较集中,便于代码的维护。如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。


五、do - while 循环

在循环语句中 do while 语句的使用较少。

1. do - while 循环的语法形式 \colorbox{PowderBlue}{1. do - while 循环的语法形式} 1. do - while 循环的语法形式

do {// 循环体// 这是一段代码块,至少执行一次
} while (条件表达式);

while 和 for 循环先判断条件,满足则执行循环体,不满足则退出循环。do-while 循环先执行循环体,然后判断条件,条件为真则重复循环,为假则退出循环。

简而言之,while 和 for 是“先判断后执行”,而 do-while 是“先执行后判断”。


2. do - while 循环的流程图 \colorbox{PowderBlue}{2. do - while 循环的流程图} 2. do - while 循环的流程图

在这里插入图片描述


3. do - while 循环的实践 \colorbox{PowderBlue}{3. do - while 循环的实践} 3. do - while 循环的实践

示例:上打印1~10的值。

int i = 1;
do
{printf("%d ", i);i = i + 1;
} while (i <= 10);

输出结果:
在这里插入图片描述


六、break 语句

在C语言中,break 语句是一种控制语句,用于立即终止最近的 switch 语句或循环(while、do…while、for)的执行,并跳出该结构。

1. 终止循环 \colorbox{PowderBlue}{1. 终止循环} 1. 终止循环

在 while、do…while 或 for 循环中,break 语句可以提前终止循环的执行。这通常在满足某个特定条件时发生,该条件表明继续迭代已经没有必要或不再安全。
示例:

for (int i = 0; i < 5; i++) 
{if (i == 2) {break; // 当 i 等于 2 时终止循环}printf("i 的值是:%d\n", i);
}

输出结果:
在这里插入图片描述


2. 终止 switch 语句 \colorbox{PowderBlue}{2. 终止 switch 语句} 2. 终止 switch 语句

在 switch 语句中,break 语句用于终止当前 case 块的执行,并跳出整个 switch 结构。(上面有示例)

注意:break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执。


七、continue 语句

在C语言中,continue 语句用于跳过当前循环迭代的剩余部分,并立即开始下一次迭代。continue 语句只能在 while、do…while 或 for 循环中使用,它不能在switch语句中使用。

1. continue 语句的基本用法 \colorbox{PowderBlue}{1. continue 语句的基本用法} 1. continue 语句的基本用法

continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

示例:

while (条件) {// 循环体的一部分if (某个条件) {continue;   // 当某个条件满足时,跳过本次循环的剩余部分}// 循环体的其余部分
}

1. continue 语句的特点 \colorbox{PowderBlue}{1. continue 语句的特点} 1. continue 语句的特点

1.跳过当前迭代的剩余代码:当continue语句被执行时,它会立即结束当前迭代,并开始下一次迭代。这意味着continue语句之后的代码将不会被执行。

2.用于条件过滤:continue 语句常用于过滤掉不满足特定条件的迭代,只处理满足条件的情况。

示例:打印 0 - 10 的奇数

for (int i = 0; i <= 10; i++) 
{if (i % 2 == 0) {continue;    // 跳过偶数,只处理奇数}printf("奇数:%d\n", i);
}

输出结果:
在这里插入图片描述


注意:1. break 语句用于完全终止循环的执行,跳出循环体。
2. continue 语句只跳过当前迭代的剩余部分,继续执行下一次迭代。


八、go to 语句

C语言提供了一种特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同一个函数内跳转到设置好的标号处。

1. go to 语句的基本用法 \colorbox{PowderBlue}{1. go to 语句的基本用法} 1. go to 语句的基本用法

goto 标签名;

示例:

    int i;for (i = 0; i < 5; i++) {if (i == 3) {goto end; // 当 i 等于 3 时,跳转到 end 标签处}printf("i 的值是:%d\n", i);}end:printf("循环结束,i 的值是:%d\n", i);

输出结果:
在这里插入图片描述

在这个例子中,当变量 i 的值等于3时,go to 语句会将控制流转移到 end: 标签处,跳过循环的剩余部分,并直接打印 “循环结束,i 的值是:3”。


注意:1. 代码可读性:过度使用 go to 语句可能会使得代码的逻辑变得难以跟踪和理解,从而降低代码的可读性。
2. 代码维护性:使用 goto 语句可能会导致代码维护困难,因为它打破了程序执行的自然流程。
3. 但在多层循环的代码中,如果想快速跳出使用 goto 就非常的方便了。


总结

本文章主要介绍了 if - else 语句,switch - case 语句,while 循环,for 循环,do -while 循环,break, continue 和 goto 语句等。这些控制语句和循环是 C 语言编程的基础,掌握它们对于编写结构清晰、逻辑明确的程序至关重要。

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

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

相关文章

中国人寿财险青岛市分公司:科技赋能,车险服务再升级

中国人寿财险青岛市分公司积极响应国家号召&#xff0c;大力推进车险综合改革&#xff0c;以科技赋能车险服务&#xff0c;实现服务再升级。公司利用AI技术&#xff0c;实现车险报案的自动化处理&#xff0c;大幅缩短了理赔周期。同时&#xff0c;公司还通过大数据分析&#xf…

【力扣】[Java版] 刷题笔记-101. 对称二叉树

题目&#xff1a;101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 解题思路 可以理解为遍历对比&#xff0c;最简单的方法就是递归。 解题过程 递归&#xff1a;左右子树分开遍历&#xff0c;左子树遵循根、左、右的顺序&#xff0c;右子树循…

重学SpringBoot3-Spring WebFlux之SSE服务器发送事件

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE&#xff1f;2. Spring Boot 3 响应式编程与 SSE为什么选择响应式编程实现 SSE&#xff1f; 3. 实现 SSE 的基本步骤3.…

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候&#xff0c;各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短&#xff0c;但是“麻雀虽小&#xff0c;五脏俱全”&#xff0c;但是却非常适合用来熟悉程序结构、规范&#xff0c;快速形成对编…

技术杂谈与进阶01--------战时操作系统与国产化数据库 |截止到目前修改时间,本文已上全站综合热榜

写文不易 给我点点关注 和点点赞 点点收藏吧 目录 为什么国产化&#xff1f; 操作系统 suse 统信uos 的阉割版 deepin &#xff08;deepin又名深度操作系统&#xff09; 麒麟 的阉割版 -欧拉 debian 的修改残版 ubuntu 国产数据库 开源数据库 部分开源数据库 …

uniapp使用uni-push模拟推送

uniapp使用uni-push模拟推送 第一步先去uniapp开发者中心添加开通uni-push功能 这里的Android 应用签名可以先用测试的官网有,可以先用这个测试 官方测试链接文档地址 在项目中的配置文件勾选 组件中使用 如果要实时可以去做全局ws //消息推送模版uni.createPushMessage(…

人工智能进程;算子加速的具体计算部分;大模型GPT5:参数18万亿;大模型面临问题

目录 人工智能进程 算子加速的简单理解,举例说明 一、简单理解 二、举例说明 一、算子加速的具体计算部分 二、举例说明 三、算子加速是否仅针对GPU 大模型GPT5:参数18万亿 大模型面临问题 算力集群设计框架 人工智能进程

算法-二叉树的最大路径和

为了找到二叉树的最大路径和&#xff0c;我们需要考虑所有可能的路径&#xff0c;包括不经过根节点的路径&#xff0c;所以其实如果你从整体上来一条路径一条路径的遍历&#xff0c;太复杂&#xff0c;我们可以换个思路&#xff0c;从每个节点出发&#xff0c;就把那个节点当成…

C++ | Leetcode C++题解之第504题七进制数

题目&#xff1a; 题解&#xff1a; class Solution { public:string convertToBase7(int num) {if (num 0) {return "0";}bool negative num < 0;num abs(num);string digits;while (num > 0) {digits.push_back(num % 7 0);num / 7;}if (negative) {dig…

Github优质项目推荐(第八期)

文章目录 Github优质项目推荐 - 第八期一、【manim】&#xff0c;66.5k stars - 创建数学动画的 Python 框架二、【siyuan】&#xff0c;19.5k stars - 个人知识管理软件三、 【GetQzonehistory】&#xff0c;1.3k stars - 获取QQ空间发布的历史说说四、【SecLists】&#xff0…

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 过期策略 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 过期策略 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

python 制作 发货单 (生成 html, pdf)

起因&#xff0c; 目的: 某个小店&#xff0c;想做个发货单。 过程: 先写一个 html 模板。准备数据&#xff0c; 一般是从数据库读取&#xff0c;也可以是 json 格式&#xff0c;或是 python 字典。总之&#xff0c;是数据内容。使用 jinja2 来渲染模板。最终的结果可以是 h…

【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题

解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题 1. 确定物理机docker和docker compose已经安装2. 编写Jenkins Agent结点docker-compose.yaml配置文件3. 修改docker运行时文件权限4. 启动容器并验证 最近接触到一个发布产物是一个 docker镜像的项…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…

Android使用协程实现自定义Toast弹框

Android使用协程实现自定义Toast弹框 ​ 最近有个消息提示需要显示10s,刚开始使用协程写了一个shoowToast方法&#xff0c;传入消息内容、显示时间和toast显示类型即可&#xff0c;以为能满足需求&#xff0c;结果测试说只有5s&#xff0c;查看日志和源码发现Android系统中Toa…

【AI大模型】深入解析 存储和展示地理数据(.kmz)文件格式:结构、应用与项目实战

文章目录 1. 引言2. 什么是 .kmz 文件&#xff1f;2.1 .kmz 文件的定义与用途2.2 .kmz 与 .kml 的关系2.3 常见的 .kmz 文件使用场景 3. .kmz 文件的内部结构3.1 .kmz 文件的压缩格式3.2 解压缩 .kmz 文件的方法3.3 .kmz 文件的典型内容3.4 .kml 文件的结构与主要元素介绍 4. 深…

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

TikTok运营对IP有什么要求?

TikTok在进行直播带货时&#xff0c;网络环境的配置尤为关键&#xff0c;网络质量直接影响到直播效果&#xff0c;因此选择稳定的IP地址很重要。那么&#xff0c;TikTok直播时该选择什么样的IP地址呢&#xff1f;接下来&#xff0c;我们来深入分析一下。 TikTok对IP地址的要求 …

解读数字化转型的敏捷架构:从理论到实践的深度分析

在当今数字经济的推动下&#xff0c;企业要在瞬息万变的市场中保持竞争力&#xff0c;数字化转型已经不再是一种选择&#xff0c;而是不可避免的战略需求。然而&#xff0c;企业如何从理论到实践进行有效的转型&#xff0c;尤其是在复杂的技术环境中&#xff0c;如何通过正确的…

【FISCO BCOS】二十二、使用Key Manager加密区块链节点

#1024程序员节&#xff5c;征文# 落盘加密是对节点存储在硬盘上的内容进行加密&#xff0c;加密的内容包括&#xff1a;合约的数据、节点的私钥。具体的落盘加密介绍&#xff0c;可参考&#xff1a;落盘加密的介绍&#xff0c;今天我们来部署并对节点进行落盘加密。 环境&a…