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

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

先来问你一个问题,一个简单的数学问题,不过你尽量快点回答,区间[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 是它的下标

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

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

END

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

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

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

  1. Go语言编程笔记18:软件测试

    Go语言编程笔记18:软件测试 图源:wallpapercave.com 软件测试也是软件开发的重要组成部分,本篇文章将探讨如何使用Go的标准库和第三方库对程序进行测试. testing Go的标准库 ...

  2. Go语言编程笔记16:存储数据

    Go语言编程笔记16:存储数据 图源:wallpapercave.com 几乎任何程序都绕不开读写数据,只不过具体的数据存储介质和方式有所不同.本篇文章将从多种数据存储方式进行探讨各种存储方式如何实现 ...

  3. Go语言编程笔记12:web基础

    Go语言编程笔记12:web基础 图源:wallpapercave.com 开一个新坑,用Go来做web开发.虽然已经从事多年基于LAMP的web开发,但最近学习了Go编程,所以打算借着学习<G ...

  4. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...

    如果用C语言输出:Hello,world!,该如何编写程序? **代码如下:** #include//包含标准库的信息 main()//定义名为main的函数,不接受参数值 {//main函数的语句都 ...

  5. 分享一份 Go 语言编程笔记

    在当今流行的编程语言中,Go 语言独树一帜,因为其简单易学.性能强劲且原生支持并发的特点,深受开发者的青睐.Stack Overflow 2022 的调查显示,同等工作年限下,Go 的年薪要远远高于传 ...

  6. C语言编程笔记——MOOC翁恺

    第一周:程序设计与C语言 1.编程:是告诉计算机去做什么,用编程语言写出来如何去解决问题,而不是去用编程语言和计算机交流,而是描述要求它如何做事情的过程和方法 2.解释和编译的区别: 解释:是用一种软 ...

  7. C语言编程笔记丨一种很酷的 C 语言技巧

    C语言常常让人觉得它所能表达的东西非常有限.它不具有类似第一级函数和模式匹配这样的高级功能.但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了.指定的初始化很多人都知道像这 ...

  8. for的嵌套c语言用星号表示三角形ppt,C语言编程求助!“使用循环语句打印出星号三角形”(如下图)...

    int i,j,n;scanf("%d",&n);for(i=0 由热心网友提供的答案1: #include void main() { int i,j,k; f #inc ...

  9. shell高级编程笔记(第十章 循环和分支)

    第十章 循环和分支 对代码块进行操作是有组织的结构化的shell脚本的关键.为了达到这个目的,循环和分支提供帮助. 10.1 循环 循环就是重复一些命令的代码块,如果条件不满足就退出循环. for 循 ...

最新文章

  1. JavaScript正则替换去除字符串中特殊字符
  2. wxWidgets 示例演示 wxWrapSizer 的使用
  3. string常用操作
  4. vue中使用keepAlive组件缓存遇到的坑
  5. 中间件中渲染Razor视图
  6. ADO连接各种数据库
  7. javascript textContent与innerText的异同分析
  8. sonarqube汉化
  9. 大数据如何改变企业的业务
  10. 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
  11. freenas 蜗牛星际_从“白群晖”到“蜗牛星际”,到底哪种NAS方案适合我?
  12. android程序 幻灯片,安卓看图软件 要可以直接幻灯片一个包含很
  13. 苹果和亚马逊因疑似侵犯云端同步功能专利而被提起美国337调查
  14. win10添加组策略命令
  15. Zemax学习笔记——序列模式点光源与平行光设置
  16. vga转html电脑打不开,VGA转HDMI转换器解决电脑连接投影仪的问题
  17. ios native react 闪退_react-native-image-picker闪退的解决办法
  18. 一篇文章学会使用 CompletableFuture(JDK9)
  19. 使用iso安装linux系统安装教程,使用光盘iso实现Linux操作系统的自动安装部署
  20. 【杂题】cf1041fF. Ray in the tube

热门文章

  1. aws iam 架构图_使用IAM保护您的AWS基础架构
  2. activemq网络桥接_ActiveMQ –经纪人网络解释–第5部分
  3. 反模式设计_设计模式:模式或反模式,这就是问题
  4. c语言构建栈_选择技术栈构建通用平台
  5. 您的第一个Lagom服务– Java Microservices入门
  6. 将JQGrid与Spring MVC和Gson集成
  7. 定制Hamcrest Matchers
  8. 使用Camel从WildFly 8向WebLogic 12发送JMS消息
  9. Java线程面试的前50个问题,面向初学者和经验丰富的程序员
  10. ActiveMQ –经纪人网络解释–第4部分