iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言进阶教程之循环语句缺陷详析
  • 128
分享到

C语言进阶教程之循环语句缺陷详析

2024-04-02 19:04:59 128人浏览 八月长安
摘要

目录前言1 循环语句的三要素2 使用不同循环语句实现六种排列组合2.1 第一种排列(ABC)2.2 第二种排列(ACB)2.3 第三种排列(BCA)2.4 第四种排列(CBA)2.5

前言

你是否也有过下面的体会?

为什么刚开始学习C语言时很喜欢用for循环语句,但逐渐发现有经验的工程师都在用while和do-while循环(看过内核代码的小伙伴应该也注意到这点了)?

在刚开始写循环语句时总分不清什么时候用for,什么时候用while,什么时候又该使用do-while;刚把这些问题搞清楚了,觉得已经熟练掌握了所有循环语句的使用,但又时不时遇到一个新的问题——总得在循环语句中,甚至是循环语句前和循环语句后添加代码,调整语句顺序,否则最终的逻辑就不正确,甚至是出现指针的解引用错误。

当遇到这些问题时,你是否怀疑过C语言的循环语句是自带缺陷的?下面就让我们一起找出困扰我们编程的幕后黑手吧~~

1 循环语句的三要素

实现一个循环语句的三要素是:

  • A. 判断:判断退出条件是否满足,如果满足则退出循环;如果不满足则循环继续。
  • B. 执行:执行需要循环的内容;内容中一般都会引用循环变量,否则循环就是无差别的。
  • C. 移动:移动循环变量,否则退出条件永远无法满足,循环就演变成了死循环,这也是初学者很容易落的。

根据上述三个要素的执行顺序,可以得到下述6种排列组合。

编号 顺序
1 A -> B -> C
2 A -> C -> B
3 B -> C -> A
4 C -> B -> A
5 B -> A -> C
6 C -> A -> B

你所编写的程序中都逃不出以上这六种排列组合,下面我们对其一一进行剖析。

2 使用不同循环语句实现六种排列组合

2.1 第一种排列(ABC)

这种顺序是我们最最熟悉的,也是最常见的。实现起来并不复杂,也是C语言循环语句最擅长处理的情况。

使用for语句实现



for (; A; C) {
    B;
}

使用while语句实现



while (A) {
    B;
    C;
}

2.2 第二种排列(ACB)

这种顺序我们就不是经常见到了,所以,for语句对它的支持就不是那么友好了,但是while语句没有受到任何影响。

使用for语句实现



for (; A; ;) {
    C;
    B;
}

使用while语句实现



while (A) {
    C;
    B;
}

2.3 第三种排列(BCA)

对于这种排列,for语句彻底没脾气了,while语句也蔫儿了,do-while语句可以大显身手了。

使用for语句实现



for (B, C; A; C;) { 
    B;
}

使用while语句实现



B; 
C;
while (A) {
    B;
    C;
}

使用do-while语句实现



do {
    B;
    C;
}while (A); 

2.4 第四种排列(CBA)

这种排列跟上一种类似。不过对for语句就更不友好了。

使用for语句实现



for (C, B; A; C,B;) 

使用while语句实现



C; 
B;
while (A) {
    C;
    B;
}

使用do-while语句实现



do {
    C;
    B;
}while (A); 

2.5 第五种排列(BAC)

对于这种排列,C语言的循环语句们心里都在想,这是什么鬼地方,没见过啊~~

使用for语句实现



for (B; A; ;) { 
    C;
    B;
}

使用while语句实现



B; 
while(A) {
    C;
    B;
}

使用do-while语句实现

它说它不在家,让我们去找break。

使用while-break语句实现



while (1) {
 B;
 if (!A)
     break;
 C;
}

2.6 第六种排列(CAB)

这种排列和第五种类似,不使用break仍然无法解决代码重复问题。

使用for语句实现



for (C; A; C) {
    B;
}

使用while语句实现



C;
while (A) {
    B;
    C;
}

使用while-break语句实现



while (1) {
    C;
    if (!A)
        break;
    B;
}

3 什么时候用for循环语句

通过上面的实验和摸索,我们发现for语句最适合的场景就是第一种排列(ABC)的场景。在应用与其他场景时要么就退化为while,要么就束手无策了。

这就是for语句的缺陷之所在。

所以,你去看linux内核或者其他大型项目,其中的for语句都是比较少的,你所见到的基本都长成下面这两种样子。



#define MAX 100
int i;
for (i = 0; i < MAX; ++i) {
    
}

我是分割线。。。



for (;;) {
    
}

第二种应用范式一般都是用在线程死循环中,当然死循环使用while(1)也可以,只能说是大家都这么用习惯了而已,你可以选择自己喜欢的方式。

4 什么时候用while循环语句

while语句适用于第一种排列(ABC)和第二种排列(ACB)场景。

这种场景的特点是——A在最开始执行。

5 什么时候用do-while循环语句

do-while语句适用于第三种排列(BCA)和第四种排列(CBA)场景。

这种场景的特点是——A在最后执行 。

6 其他情况

其他情况包括第五种排列(BAC)和第六种排列(CAB)场景,以及其他更复杂的场景。

这种场景的特点是——A在中间执行。

这种情景一般就采用whie-break语句来cover了。其实,该语句可以cover住所有场景。

爱刨根问题的同学可能会问,怎么会有这种场景呢?真的有需求么?

那我在此给出一个CABC真实场景的小例子吧,起到抛砖引玉的作用。



while(1){
    pstr = find_cmd(fORMat_str, pstr); 
    if (NULL != pstr) 
    {   
        
        printf("----------------------------------------------------------------------------\n");
        printf("|| name    \t| %s \n",pstr->name);
        printf("|| brief   \t| %s \n",pstr->brief);
        for (i = 0; i < pstr->arGC; i++)
        {
            if (pstr->argv[i])
                printf("|| @ para%d\t| @ %s \n", i, pstr->argv[i]);
        }
        printf("----------------------------------------------------------------------------\n");
  
        
        pstr++; 
    } else {
        break;
    }
}

7 总结

文章已经很长了,最后不废话,直接上表格。

编号 顺序 合适的循环语句
1 A -> B -> C for/while
2 A -> C -> B while
3 B -> C -> A do-while
4 C -> B -> A do-while
5 B -> A -> C while-break
6 C -> A -> B while-break
x 复合场景 while-break

到此这篇关于C语言进阶教程之循环语句缺陷的文章就介绍到这了,更多相关C语言循环语句缺陷内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言进阶教程之循环语句缺陷详析

本文链接: https://www.lsjlt.com/news/131989.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言进阶教程之循环语句缺陷详析
    目录前言1 循环语句的三要素2 使用不同循环语句实现六种排列组合2.1 第一种排列(ABC)2.2 第二种排列(ACB)2.3 第三种排列(BCA)2.4 第四种排列(CBA)2.5...
    99+
    2024-04-02
  • C语言之循环语句详细介绍
    目录前言while语句do...while语句for语句结语前言 C语言中的循环结构是程序中的一个基本结构。 循环结构可以使我们写很少的语句,让计算机反复执行某一过程。 C语言提供了...
    99+
    2024-04-02
  • C语言之陷阱与缺陷详解
    目录一、前言二、字符指针三、边界计算与不对称边界1.经典错误①2.经典错误②3、小结四、求值顺序五、运算符&& ||和!总结一、前言 二、字符指针 结论一:复制指...
    99+
    2024-04-02
  • C语言控制语句之 循环
    入口条件循环:while循环 在执行多次循环之前之就已经决定是否执行循环 代码格式: while(关系表达式) 语句 //可以是以分号结尾的简...
    99+
    2024-04-02
  • C语言基础解析之分支与循环语句
    目录- if语句:if(表达式)悬空else问题- switch语句要注意的细节switch中的的default子句:- while循环语法结构- for循环语法结构- do whi...
    99+
    2024-04-02
  • C语言进阶教程之预处理
    目录一.代码运行是的两种环境二.翻译环境三.预定义符号四.#define1.define  定义宏2.带有副作用的宏参数五.#define定义宏 与函数对比六.预处理指令七...
    99+
    2023-02-10
    什么是预处理 c语言编译预处理命令 c语言预处理指令作用
  • C语言进阶教程之函数指针详解
    目录一、函数指针1.概念1.2函数指针的使用方法1.3练习巩固1.4小结一下二、阅读两段有趣的代码1.( *(void( *)( ))0 )( )2.void (* signal(i...
    99+
    2024-04-02
  • C语言循环与分支语句实例分析
    本篇内容主要讲解“C语言循环与分支语句实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言循环与分支语句实例分析”吧!写在开始0表示假,非0表示真。1. 分支语句分支语句也叫做条件选择语...
    99+
    2023-06-30
  • Go语言学习之循环语句使用详解
    目录1、for循环2、for-each语法3、break的使用4、continue的使用5、goto的使用1、for循环 写法基本和其他语言一致,只是没有了while循环,用for代...
    99+
    2024-04-02
  • 手把手带你走进Go语言之循环语句
    目录概述循环语句方法一方法二方法三break 关键字continue 关键字goto 关键字【Golang】✔️走进 Go 语言✔ʊ...
    99+
    2024-04-02
  • C语言详细讲解循环语句的妙用
    目录一、循环语句分析二、do ... while 语句的循环方式三、while 语句的循环方式四、for 语句的循环方式五、break和 continue 的区别六、do 和 bre...
    99+
    2024-04-02
  • C语言进阶栈帧示例详解教程
    目录正片开始栈有什么用?寄存器main函数创建局部变量创建函数部分形参与实参正片开始 今天来讲讲我对栈帧创建与销毁的拙见。理解什么是栈帧首先知道什么是栈: 在数据结构中, 栈是限定仅...
    99+
    2024-04-02
  • C语言陷阱与缺陷之数组越界访问详解
    目录1.问题引入2、问题分析(1)理论分析(2)调试验证总结1.问题引入 一道经典的笔试题来了,请做好准备!!! 试问以下代码在Visual studio 2019环境下执行结果?原...
    99+
    2024-04-02
  • 从头学习C语言之for语句和循环嵌套
    目录for语句:前言:注意事项:语句形式:执行顺序:示例:循环嵌套:语句形式:流程图:示例:总结for语句: 前言: 循环的基本结构离不开三个基本动作: 初始化计数器循环条件更新计数...
    99+
    2024-04-02
  • C++入门到精通之循环语句的使用教程
    目录一、循环的类型1.while循环2.for循环3.do…while循环二、循环控制语句1.break语句2.continue语句3.goto语句三、无限循环有的时候...
    99+
    2024-04-02
  • 【Java编程教程】详解 Java for 循环语句
    Java for 循环用于多次迭代程序的一部分。如果迭代次数固定,建议使用for循环。 Java 中有三种类型的 for 循环。   简单的 for 循环 For-each或增强型 for 循环 标记为循环 # Java 简单 ...
    99+
    2023-10-10
    java jvm servlet
  • Python基础教程之循环语句(for、while和嵌套循环)
    循环可以用来重复执行某条语句,直到某个条件得到满足或遍历所有元素。 1 for循环 是for循环,可以把集合数据类型list、tuple、dict、set的元素遍历出来。 (1)对...
    99+
    2024-04-02
  • C语言进阶教程之字符串&内存函数
    目录前言:一、求字符串长度strlenstrlen函数的模拟实现二、长度不受限制的字符串函数strcpystrcpy函数的模拟实现strcatstrcat函数的模拟实现strcmps...
    99+
    2024-04-02
  • C语言进阶之文件操作详解
    目录0. Intro1. 文件名2. 文件的打开和关闭2.1 文件指针2.2 打开和关闭文件3. 文件顺序读写3.1 利用以上函数实现拷贝文件操作3.2 二进制的读写3.3 格式化输...
    99+
    2024-04-02
  • C语言超详细讲解循环与分支语句基础
    目录写在开始1. 分支语句1.1 if语句1.2 switch2. 循环语句2.1 while()语句2.2 do while()语句2.3 for 语句for语句中表达式的省略br...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作