C语言KR圣经笔记 3.6 do-while循环 3.7 break和continue 3.8 goto和标号

3.6 do-while循环

如第1章所述,while 和 for 在循环顶部检查结束条件。与之相反,C语言的第三个循环,do-while 是每轮循环的主体走完之后,在底部检查结束条件;循环体至少会执行一次。

do 的语法为

do

        语句

while (表达式);

先执行语句,然后对表达式求值。如果为真,则继续执行语句,接着再对表达式求值,就这样循环往复。当表达式变为假时,循环结束。除了检查的含义外,do-while 等价于Pascal的 repeat-until语句【Pascal的 until 判断为真则循环退出,与C语言的 while 表达式判断为假才退出,含义正好相反】

经验显示 do-while 用得比 while 和 for 少得多。然而,有时它也是有价值的,比如下面这个函数 itoa,将一个数转换成字符串( atoi 的反向处理)。这活儿比你一开始可能想的要稍微复杂些,因为用简单方法生成的字符串顺序是错误的。我们选择反向生成字符串,然后将其翻转。【reverse函数见上一节】

/* itoa: 把n转换成字符串,存入s */
void itoa(int n, char s[])
{int i, sign;if ((sign = n) < 0)   /* 记录符号 */n = -n;           /* 使n为正数 */do {                /* 倒序生成字符串 */s[i++] = n % 10 + '0';     /* 获取下一个数位 */} while ((n /= 10) > 0)        /* 删除该数位 */if (sign < 0)s[i++] = '-';s[i] = '\0';reverse(s);
}

这里用 do-while 是必要的,至少是方便的,因为至少要有一个字符被放到数值 s 中,即使 n 是 0。尽管大括号不是必需的,我们还是把构成 do-while 主体的单条语句包在其中,避免草率的读者把 while 部分错看成是一个 while 循环的开始

练习3-4、在数字用2的补码表示的机器上,我们的 itoa 版本无法处理最大的负数,即当 n = -(2的字长 -1 次方)。解释为何如此。修改程序使之打印正确的值,不管它跑在什么机器上。

练习3-5、写函数 itob(n ,s, b) 将整数 n 转换成以 b 为基数的字符串并存入字符串 s 中。特别说明,itob(n, s, 16) 把 n 格式化为 16进制数存入s中。

练习3-6、写个一版接受3个而不是2个参数的 itoa 函数。第三个参数为最小域宽度;有必要的话,在转换后的数字左侧填充空格使其达到足够的宽度。

3.7 break和continue

不通过顶部或底部的条件检查而直接从循环中退出,有时会比较方便。break 语句提供了从 for、while 和 do 中提前退出的方法,还包括前面说过的 switch 。break 会使它所在的最内层循环或 switch 马上退出。

下面的函数 trim 从字符串末尾删除结尾的空格,制表符和换行符,当发现最右边的非空格、非制表符、非换行符时,它使用 break 从循环中退出。

/* trim: 删除末尾的空格、指标和换行符 */
int trim(char s[])
{int n;for (n = strlen(s)-1; n >= 0; n--)if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')break;s[n+1] = '\0';return n;
}

strlen 返回字符串的长度。for 循环从末尾开始反向扫描,寻找第一个非空格、非制表、非换行符。当找到一个这样的字符,或者 n 变为负数时(此时整个字符串都扫描完了),循环结束。你应该验证,即使在字符串为空或者只包含空白字符的时候,这个处理也是正确的。

continue 语句与 break 相关,但用的少一些;它会使其所在的 for、while 和 do 循环开始下一轮迭代。在 while 和 do 中,这意味着马上执行括号内的检查部分;而对于 for, 控制转移到递增的步骤【即表达式3】。continue 语句只用于循环,不用于 switch。若循环内有 switch 且 switch 内有 continue 时,这个 continue 会使循环进入下个迭代。

例如,下面这个代码段只处理数组 a 中的非负元素;负值都被跳过了

for (i = 0; i < n; i++) {if (a[i] < 0)    /* 跳过负元素 */continue;...   /* 处理正元素 */
}

 continue 语句经常用在这种情况:当循环后面的一部分非常复杂,而把测试条件反转然后再加一层缩进,会让程序嵌套太深【而影响阅读/维护】

3.8 goto 和 标号

C提供了可被无限滥用的 goto 语句,以及跳转的标号。正式地说,goto 并非必要,而且实践中总是很容易写出不用 goto 的代码。本书中我们还没用过 goto。

然而,还是存在一些也许可以使用 goto 的场景。最常用的是从某些深深嵌套的结构中放弃处理,比如从两层或更多层的循环中马上跳出来。不能直接使用 break 语句是因为它只能退出最内层的循环。像这样:

for (...)for (...) {if (disaster)goto error;}
...error:善后处理

如果错误处理代码很重要,而且错误会发生在多处,则这个代码组织方式是很方便的。

标号的形式与变量名相同,后面跟着冒号。标号可以加到与 goto 所在同一函数的任一语句前面。标号的作用域是整个函数。

另一个例子是判断两个数组 a 和 b 是否有相同的一个元素。一种可能的写法是:

    for (i = 0; i < n; n++)for (j = 0; j < m; j++)if (a[n] == b[m])goto found;/* 没找到相同元素的处理 */...
found:/* 找到 a[i] == b[j] */...

涉及 goto 的代码总是能写成不带 goto的,尽管可能的代价是一些重复的检查或一个额外的变量。例如,上面的例子改写为

found = 0;
for (i = 0; i < n && !found; i++)for (j = 0; j < m && !found; j++)if (a[n] == b[m])found = 1;
if (found)/* 找到 a[i-1] == b[j-1] */...
else/* 没找到相同的元素 */...

除了这里举出的几个例外,依赖于 goto 语句的代码通常总是比没有 goto 的代码更难理解、更难维护。尽管我们不想在这个问题上说的太武断,但确实看起来 goto 应该少用,如果不是说完全不用的话。

(第三章完)

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

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

相关文章

MongoDB基础运维

mongodb的基础概念介绍 database #数据库 collection #集合&#xff0c;类似于mysql中的表 filed #类似于mysql中字段 document #每行的记录 连接客户端 mongo ip:port 例如mongo 127.0.0.1:27017 mongo客户端的命…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码&#xff1a;https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图&#xff1a; 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请&#xff0c;免费的。 申请地址&#xff1a;https://xinghuo.xfyun.cn/ 注册之…

【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法2】

文章目录 概要Gray-world AlgotithmGround Truth Algorithm结论&#xff1a; 概要 随着数字图像处理技术的不断发展&#xff0c;白平衡算法成为了图像处理中一个关键的环节。白平衡的目标是校正图像中的颜色偏差&#xff0c;使得白色在图像中呈现真实的白色&#xff0c;从而提…

利用MSF设置代理

1、介绍&#xff1a; 通过MSF拿到一个机器的权限后&#xff0c;通过MSF搭建socks代理&#xff0c;然后通内网。 拿到目标权限&#xff0c;有很多方法&#xff0c;比如&#xff1a;①ms17-010 ②补丁漏洞 ③MSF生成后门 在此直接使用MSF生成后门 MSF中有三个代理模块&#x…

【ATTCK】MITRE Caldera - 测试数据泄露技巧

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…

【函数讲解】pygmo中的函数 fast_non_dominated_sorting() + 利用支配关系,学习一个SVM分类器,将解分为两类

这个函数是用来执行非支配排序的&#xff0c;可以分层构建Pareto&#xff0c;并返回每一层的解以及每个解支配其他解的索引、解被其他解支配的次数、解所在的非支配层级。这个函数对这些解进行非支配排序&#xff0c;并返回四个数组&#xff1a;ndf, dl, dc, 和 ndr。 ndf (Non…

基于单片机设计的智能风扇(红外线无线控制开关调速定时)

一、项目介绍 在炎热的夏季&#xff0c;风扇成为人们室内生活中必不可少的电器产品。然而&#xff0c;传统的风扇控制方式存在一些不便之处&#xff0c;比如需要手动操作开关、无法远程控制和调速&#xff0c;以及缺乏定时功能等。为了解决这些问题&#xff0c;设计了一款基于…

红黑树-RBTree

目录 1. 红黑树的概念2. 红黑树的性质3. 结点的定义4. 结点的插入5. 整体代码 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式…

springboot苍穹外卖实战:九、小程序微信登录代码开发+商品浏览

微信登录 application.yml和application-dev.yml application-dev.yml sky:wechat:appid: xxxsecret: xxxapplication.yml sky:wechat:appid: ${sky.wechat.appid}secret: ${sky.wechat.secret}配置为微信用户生成jwt令牌时使用的配置项&#xff1a; application.yml sky…

长安链可验证数据库,保证数据完整性的可信存证方案

近日&#xff0c;长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证&#xff0c;显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景&#xff0c;被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

04-Spring中Bean的作用域

Bean的作用域 scope的属性值 属性值作用singleton默认单例prototype原型每调用一次getBean()方法则获取一个新的Bean对象 , 每次注入的时候都是新对象request一个请求对应一个Bean仅限于在WEB应用中使用 , 需要引入web的框架如SpringMvc(global) session一个会话对应一个Bean…

10个python爬虫入门实例

昨天带伙伴学习python爬虫&#xff0c;准备了几个简单的入门实例&#xff0c;涉及主要知识点&#xff1a; web是如何交互的 requests库的get、post函数的应用 response对象的相关函数&#xff0c;属性 python文件的打开&#xff0c;保存 代码中给出了注释&#xff0c;并且…

通过easyexcel导出数据到excel表格

这篇文章简单介绍一下怎么通过easyexcel做数据的导出&#xff0c;使用之前easyui构建的歌曲列表crud应用&#xff0c;添加一个导出按钮&#xff0c;点击的时候直接连接后端接口地址&#xff0c;在后端的接口完成数据的导出功能。 前端页面完整代码 let editingId; let request…

Git被上锁无法进行操作解决办法

Git操作失败并提示Another git process seems to be running in this...... 比如&#xff0c;典型的&#xff1a; Another git process seems to be running in this repository, e.g. an editor opened by git commit. Please make sure all processes are terminated then t…

【Python】一篇带你掌握数据容器之列表

目录 前言&#xff1a; 一、列表 1.列表的定义 2.列表的下标索引 3.列表的常用操作 &#xff08;1&#xff09;index方法&#xff1a;查找某元素的下标 (2)修改特定位置下标的元素 &#xff08;3&#xff09;insert&#xff08;下标&#xff0c;元素&#xff09;方法&a…

基于SpringBoot+Vue的在线学习平台系统

基于SpringBootVue的在线学习平台系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 登录界面 管理员界面 摘要 本文设计并实现了一套基于Spri…

Nuxt.js——基于 Vue 的服务端渲染应用框架

文章目录 前言一、知识普及什么是服务端渲染什么是客户端渲染&#xff1f;服务端渲染与客户端渲染那个更优秀&#xff1f; 二、Nuxt.js的特点Nuxt.js的适用情况&#xff1f; 三、Vue是如何实现服务端渲染的&#xff1f;安装依赖使用vue安装 Nuxt使用npm install安装依赖包使用n…

选择.NET 还是 Java?

1、.NET Framework的演变&#xff1a; .NET Framework&#xff1a; 最初由Microsoft引入&#xff0c;是一个Windows上的全功能框架。它包含了ASP.NET、Windows Presentation Foundation&#xff08;WPF&#xff09;、Windows Communication Foundation&#xff08;WCF&#xff…

基于springboot实现桥牌计分管理系统项目【项目源码】

基于springboot实现桥牌计分管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#…

数据分析:智能企业七步曲(一)

原创&#xff1a; MicroStrategy微策略中国 作者&#xff1a;数据杰论 时间走到2018年最后一个季度&#xff0c;过去几年热炒的大数据概念正在各行各业开始落地并展开实际应用&#xff0c;核心是关注数据如何能为企业带来价值。因此&#xff0c;数据分析及其种种实现手段不断被…