C语言编程笔记:关于 for循环 的那些不为人知的秘密

42ca6cf0d4ac8be4b1baa98775e3b713.png

点击上方蓝字关注我,了解更多咨询

11d9c04be719ed4a72e3ce978ae76701.png

好吧,也许你认为我在写一篇如何使用for循环的文章,,,,首先,我想说无论是学习C语言还是学习java的同学都能从此文中获益,还有,你确定你会用for循环吗?其实许多东西你只是在表面,要品才能有一种感觉,有的时候,我喜欢咬文嚼字一下,所以你可以认为我现在在程序中讨论关于“用推还是用敲”的话题。

fd9034729681029890f6ee2054332e67.png

先来问你一个问题,一个简单的数学问题,不过你尽量快点回答,区间[9,15]中有几个整数?

多数想马上表现自己聪明的同学可能会马上回答6个,但是是7个,你会发现这种双闭区间的元素会比你想象得多,就连[9,9]都有一个元素是吗?而半开半闭就不同了[0,10)你可以不假思索地用[m,n)中有n-m个元素,来回答这个答案,10个元素,你发现什么了没?这。。有点像数组,恩恩,这个问题就是我们在本文后面将讨论的你如何才能熟练地使用这些多1少1的问题。现在先开始说for循环

我常常把最简单的for循环称之为循环计数器:

for(inti =1;i<=10;i++)cout<<"求妹子"<

你看,这里的i只是一个计数的作用,它在告诉cpu,去把我的这条语句执行十次吧!

你可能会说,这有什么?for都是这样的呀!请你往下看

for(inti =1;i<=10;i++)cout<<"求"<

这个for就不同了,它把i做为一种产物,在循环中使用它,我把它称之为循环产生器,这个i就不仅仅是让循环执行十次的作用了,它在每次的循环中产生,循环体的语句中有自己的作用,所以当你理解所谓的循环产生器,你就会很轻松地写出各种多层循环的程序了,比如崔哥曾出个这样一个题:

请用循环语句打印一个空心菱形:

我将用一种清晰的思路来分析写这个程序,

嗯,我先写一个函数,它提供的接口如下:

void print(int n,int p,int q);//在一行输出n个元素,除了在p和q输出*其它地方都输出空格

恩,很简单的一个函数:

void print(int n,int p,int q)
{for(int i = 1;i<=n;i++){if(i==p||i==q)printf("*");elseprintf(" ");}printf("\n");
}
void print(int n,int p,int q)
{for(int i = 1;i<=n;i++){if(i==p||i==q)printf("*");elseprintf(" ");}printf("\n");
}

所以,用所谓的循环产生器,产生我们需要的参数传递给这个函数不就行了吗?

下面,我们先做一些约定

“你我约定,难过的往事不许提”。。。

开玩笑了,,,我们继续:

首先,输出空心菱形,这个行数一定是个奇数,

所以我们用1到LOW来表示这LOW个位置,而且中间的那个位置就是LOW/2+1

这样我们的程序就是这样:

#define LOW 13
int j,k,n = LOW/2+1;//空心菱形的中间位置
j=k=n;
for(int i = 1;i<=LOW;i++)
{print(LOW,j,k);if(i<n)j--,k++;elsej++,k--;
}

i做为一个产生器,不但让循环执行LOW次(打印low行)同时也控制产生这j和k这两个参数了,当然我们在清晰道理之后,完全可以把这个函数嵌到循环中,看只用了两个for,而不是某些同学的分段循环,四个for。。。

继续讨论有关for的话题,现在我要通过说明for的一些使用细节,来向你展示,你用什么样的语言决定你的编程思维,我问你如果让你访问数组a[10]的每个元素,你会写怎样的代码?

for(int i = 0;i<=9;i++)

还是

for(int i = 0;i!=10;i++)

我一直都是使用第二种,因为这可以很好地说明半开半闭区间的思想,而且,C数组本身就是从零开始的,我们用10来表示它最后一个元素的下一个位置(因为最后一个元素是a[9]),

其实,不仅仅是数组,在许多语言的迭代器(包括c++标准库)中都会使用第一个元素表示头,最后一个元素的下一个位置表示尾,半开半闭区间的这种思想可以让你不用陷入多1或是少1的问题中,比如[n,n)是没有元素的,[n,m)是有m-n个元素的。。

至于为什么是i!=10,而不是i<10,那要是这样的语句呢?

for(int i = 10;i!=0;i--)

不用把”<”改成”>”了,而且。。。作为一个终止状态,还有用(后面论述)

现在还记得开头的那个求妹子的例子吗?

for(inti =1;i<=10;i++)cout<<"求"<

这里我就让i从1到10,(我不可能求0个妹子吧?)所以,这种对循环i的选取,0或1,是很有细节思考的。

下面再看一个例子:

inti;for(i=0;a[i]!='c'&&i!=N;i++);

这段代码的作用是在一个char数组中找到第一个是’c’的元素,并返回它的索引

有几个有趣的地方:

我把i的定义放在外面

这个for循环没有循环体,看那个分号。。。。。。

不是计数器,不是产生器,我喜欢把这种for称之为循环搜捕器,它用来找一个元素

所以我把i定义在循环外,因为之后我们还要使用到i,而同时也与前面的那些for循环中把i定义到for里面形成了对比,因为之前的作用,我并不想把它的作用域外流,实际上,在c++中鼓励你这么使用for,不让它外流,这种东西在vc6.0会出点问题(因为它不是标准的c++),因为i的作用域会外流,所以你就不能写for(int i;;)这样的语句两次,它会报错说你重定义了。而在c语言中,之前是不支持for(int i;;)这种定义方式的,不过在c99的时候,它也支持了,并鼓励你这样写。

并且,通过这个搜捕器,它的条件是a[i]!='c'&&i!=N,所以循环终止时,是a[i]=='c'||i==N这就是我之前说的终止条件,我们就可以在之后写这样的语句;

if(i==N)//没找到else//找到了。i 是它的下标

这就是为什么用’!=’而不是<的原因了,这可以很清楚地看清终止条件。

以上就是今天的分享,小伙伴们可以点个赞支持一下哟~

1eae25b380ad694c6ba5353e0b8cec77.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

a37227a1a87e7c82e51de14d8ef65811.png

95f52888512e2de3a9a90aa1c74bf81b.gif

戳“阅读原文”我们一起进步

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

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

相关文章

chrome for mac html5,javascript – Mac上的Chrome浏览器问题

我一直在寻找很长一段时间,因为画布元素上的旋转矩形的绘制,擦除和重绘在Mac上的谷歌浏览器中不起作用.我需要这个,因为我想在画布上渲染悬停叠加层.我创建了一个代表我的代码的小提琴&#xff1a;linkHTML&#xff1a;使用Javascript&#xff1a;var canvas null;var ctx;var …

weld焊接_玩Weld-Probe –一站式查看CDI的所有方面

weld焊接当我坐在DevConf.CZ的会议室时&#xff0c; Weld 3.0.0.Alpha4已发布 。 大约在Jozef Hartinger&#xff08; jozefhartinger &#xff09;旁边或多或少 &#xff0c;后者在共享休息前几分钟告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意&…

C语言:一种通用的程序设计语言

点击上方蓝字关注我&#xff0c;了解更多咨询语言是一种通用的程序设计语言。它同UNIX系统之间具有非常密切的关系。C语言是在UNIX系统上开发的&#xff0c;且无论是UNIX系统本身还是其上运行的大部分程序&#xff0c;都是C语言编写的。但是C语言并不受限于任何一种操作系统或机…

可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动

win10服务哪些可以禁止启动&#xff1f;方法一&#xff1a;命令方法首先使用 Windows R 组合快捷键打开“运行”窗口&#xff0c;之后键入 services.msc 按下回车键&#xff0c;即可打开“服务”。方法二&#xff1a;快捷方式法在Win10桌面的“此电脑”图标上点击鼠标右键&…

drill apache_如何使用Apache Drill分析高度动态的数据集

drill apache当今的数据是动态的&#xff0c;并由应用程序驱动。 由诸如Web /社交/移动/ IOT等行业趋势驱动的新业务应用时代的增长正在生成具有新数据类型和新数据模型的数据集。 这些应用程序是迭代的&#xff0c;并且关联的数据模型通常是半结构化的&#xff0c;无模式的且不…

如何用最短的时间学会C语言,并掌握C语言的精髓所在?

点击上方蓝字关注我&#xff0c;了解更多咨询及C语言&#xff0c;我想凡是学过它的朋友都有这样一种感觉&#xff0c;那就是“让我欢喜让我忧。”欢喜的是&#xff0c;C语言功能非常强大、应用广泛&#xff0c;一旦掌握了后&#xff0c;你就可以理直气壮地对他人说“我是电脑高…

山西能源计算机专业,山西能源学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...

类似问题答案四川大学计算机科学与技术专业2016年在山西理科高考录取最低分数线学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 学校 地 区 专业 年份 批次 类型 分数 四川大学 山西 计算机科学与技术 2016 一批 理科 610 四川大学 山…

apache fop_Apache FOP与Eclipse和OSGi的集成

apache fopApache FOP是由XSL格式化对象&#xff08; XSL-FO &#xff09;驱动的开源打印处理器。 例如&#xff0c;将数据对象转换为PDF可能非常有用。 但是&#xff0c;事实证明&#xff0c;将其集成到PDE中并最终以OSGi Service的形式启动和运行有点麻烦。 因此&#xff0c…

2022年最值得学习的 5 种编程语言,你有在学习吗?

点击上方蓝字关注我&#xff0c;了解更多咨询作为一个初学者电脑程序员&#xff0c;很多人都会想知道当下主流的编程语言有哪些&#xff0c;哪些行业和公司都在用它们&#xff0c;因为这些信息可以帮助你了解想要学习的内容&#xff0c;使你更接近最终想用代码完成的事情。今天…

计算机组装名词术语解释,计算机名词解释及简答题总结

计算机名词解释及简答题总结信息技术&#xff1a;指的是用来扩展人们信息器官功能&#xff0c;协助人们更有效地进行信息处理的一类技术1.信息处理&#xff1a;信息的收集、加工、存储、传递、施用相关的行为和活动2.信息产业&#xff1a;是指生产制作信息设备&#xff0c;以及…

wildfly mysql_MySQL作为Kubernetes服务,可从WildFly Pod访问

wildfly mysqlKubernetes上使用Vagrant的Java EE 7和WildFly&#xff08;技术提示&#xff03;71&#xff09;介绍了如何在使用Kubernetes和Docker托管的WildFly上运行琐碎的Java EE 7应用程序。 Java EE 7应用程序是在世界范围内交付的动手实验室 。 它使用与WildFly捆绑在一起…

想学C语言?这些你一定要知道

点击上方蓝字关注我&#xff0c;了解更多咨询首先&#xff0c;你想运行自己的C语言程序&#xff0c;就必须要有一个IDE&#xff08;集成式开发工具&#xff09;。不然想运行程序很难。这里有两个方法可以运行你的C语言程序&#xff0c;一个是在菜鸟网站上云运行C语言程序&#…

mongodb实验报告_Dropwizard,MongoDB和Gradle实验

mongodb实验报告介绍 我使用Dropwizard&#xff0c;MongoDB和Gradle创建了一个小项目。 它实际上是作为一个实验性的Guava缓存开始的&#xff0c;作为将计数器发送到MongoDB&#xff08;或任何其他DB&#xff09;的缓冲区。 我也想尝试MondleDB插件的Gradle。 接下来&#xff0…

历城职专学前计算机专业,历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕...

原标题&#xff1a;历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕技能运动会学前教育专业技能运动会1月13日&#xff0c;历城职专学前教育专业2020学年第一学期技能运动会拉开帷幕&#xff0c;技能运动会是历城职专对每一位职专学子专业技能考核的一项重要检测&…

guava集合操作类的使用_使用Guava进行测试集合的实现

guava集合操作类的使用我目前正在为LibFX添加一项新功能&#xff0c;为此我创建了一些类似于Java Collections Framework的自定义集合。 我一直在寻找可以与之对抗的测试&#xff0c;并很高兴发现Google的Guava包含了我所需要的&#xff1a;一个庞大的测试套件&#xff0c;可以…

如何正确认识C语言在当今编程领域的地位

点击上方蓝字关注我&#xff0c;了解更多咨询一、什么是语言&#xff0c;什么是C语言&#xff0c;有什么区别与联系&#xff1f;一提到语言这个词&#xff0c;人们自然想到的是像英语、汉语等这样的自然语言&#xff0c;因为它是人和人相互交流信息不可缺少的工具。大家听到我们…

三十学计算机编程,计算机学习三宗罪3——计算机达人成长之路(25)

6、论道(四)计算机学习三宗罪之偏科上文说道木鹏飞声明计算机学习的第二宗罪是学习浮躁&#xff0c;只流于表面而不肯深入底层学习&#xff0c;并指出了编程的三重境界。木鸿飞则继续咨询第三宗罪。“第三宗罪就是偏科。具体来讲有两种表现&#xff0c;一是动手编程和理论学习二…

fx 线程 弹窗_JFXPanel和FX Platform线程陷阱

fx 线程 弹窗JFXPanel是一个组件&#xff0c;可将JavaFX内容嵌入到&#xff08;旧版;-)&#xff09;Swing应用程序中。 基本上&#xff0c;这使合并两个对象变得非常容易&#xff0c;但是要掌握一些陷阱&#xff1a;两个UI工具箱都是单线程的&#xff08;Swing&#xff1a;EDT …

计算机操作系统的新技术新知识,计算机操作系统教程:核心与设计原理

计算机操作系统教程&#xff1a;核心与设计原理语音编辑锁定讨论上传视频《计算机操作系统教程——核心与设计原理》是2007年清华大学出版社出版的图书&#xff0c;作者是范策、许宪成、黄红桃。书 名计算机操作系统教程——核心与设计原理作 者范策许宪成黄红桃等ISBN97…

理解好内存管理,C语言就不难学了

点击上方蓝字关注我&#xff0c;了解更多咨询任何程序运行起来都需要分配内存空间存放该进程的资源信息的&#xff0c;C程序也不例外。C程序中的变量、常量、函数、代码等等的信息所存放的区域都有所不同&#xff0c;不同的区域又有不同的特性。C语言学习者、尤其是在学习嵌入式…