每个人一生中都至少应该获得一次全场起立鼓掌的机会,因为我们都曾胜过这个世界。 —R.J.帕拉西奥《奇迹男孩》
导言:希腊哲学家Zeno曾经说“运动是不可能的。由于运动的物体在到达目的地前必须到达其半路上的点,若假设空间无限可分则有限距离包括无穷多点,于是运动的物体会在有限时间内经过无限多点。”这便是Zeno提出的两分法悖论。他还提出说箭永远不会到达它的目标。他认为箭要到达目标距离的一半,然后再达剩余距离的一半,然后依次到达剩余距离的一半,这样就有无穷无尽。所用的时间也无穷无尽。当然,现在普遍看来Zeno只有自己愿意当靶子才会有这样的结论。
那么我们便可以写一个程序来证明,假设箭第一次走完一半的路程时间为1秒,然后每1/2秒走完剩余距离的一半,然后再用1/4秒走完剩余距离的一半…那么我们可以用下面的这个式子来表达总时间:
1+1/2+1/4+1/8+…
这里是不是有很多个式子相加,那么我们该如何把这些式子写到程序中呢?
这里我们就需要请三位老大来掌控局面了,为什么是三位呢?我们在数组那里是不是提到过老大,那里只有一个老大,这里为啥有三个呢?虽然那里只有一个老大,但是他小弟多呀,这里呢,却只有三个光杆司令
下面我来一一介绍这三位光杆司令(While,do while,for)
NO.1
首先登场的呢是我们的while,它是一个英文单词独挡一面啊。While语句也称While循环,循环中While是入口条件循环,程序再进入循环体之前必须获取输入的数据并检查条件中的值。
1.while循环的通用形式如下:
while(表达式){
循环体; }//循环体也可以为空语句
注释:当表达式为真时,则执行下面的循环体;循环体执行完之后再判断表达式是否为真,如果为真,则再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这便是 while 的执行顺序。
2.终止while循环:
while循环有一点非常重要:在构建while循环时,必须要让测试表达式的值有变化,且表达式最终要为假,否则循环就是死循环。
还要明确一点就是只有在对测试条件求值时,才决定是终止还是循环继续。
3.while:入口条件循环(for循环语句也是)
while循环是使用入口条件的有条件循环。什么是“有条件”呢,它其实指的是语句部分的执行取决于测试表达式描述的条件。表达式是一个入口条件,因为必须要满足条件才能进入循环体。若条件不满足,则不会进入循环体。
在写while语句时括号中的表达式通常为判断语句,比如:
status==1;//判断status是否为1
status=1;//把1赋值给status
要注意的是==与=是有区别的,,==是C的相等运算符,上面表达式是判断status是否为1。而=是把1赋值给status。
注:
当初学者学编程时,for、while、do while后面的执行语句不论有多少行,就算只有一行也要加“{}”,以养成良好的编程习惯。
我们在敲代码时通常会用到伪代码,伪代码是一种简单的句子表示程序思路的方法。它与计算机的形式相对应。它有助于我们理清设计程序的逻辑。使用伪代码的好处便是我们可以把注意力集中在程序的组织和逻辑上,可以暂时不用思考该如何用编程语言来表达自己的想法。
看维基百科说伪代码:
伪代码(英语:pseudocode),又称为虚拟代码,是高层次描述算法的一种方法。它不是一种现实存在的编程语言(已经出现了类似伪代码的语言,参见Nuva);它可能综合使用多种编程语言的语法、保留字,甚至会用到自然语言。
它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java、C++、C、Delphi 等等)它更类似自然语言。它是半形式化、不标准的语言。我们可以将整个算法运行过程的结构用接近自然语言的形式(这里可以使用任何一种作者熟悉的文字,例如中文、英文,重点是将程序的意思表达出来)描述出来。使用伪代码,可以帮助我们更好的表述算法,不用拘泥于具体的实现。
人们在用不同的编程语言实现同一个算法时意识到,他们做出来的实现(而非功能)很不同。程序员要理解一个用他并不熟悉的编程语言编写的程序,可能是很困难的,因为程序语言的形式限制了程序员对程序关键部分的理解,而伪代码可以用于帮助人们理解解释代码的语法、规则、内涵和结构。于是伪代码就这样应运而生了。
当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。计算机科学在教学中通常使用伪代码,以帮助学习者能够快速并透彻地理解。
NO.2
第二位登场的老大便是do while,同样也是三大光杆司令中的一员。但他跟While不同,do while循环是出口条件语句。何为出口条件循环呢,即在循环的每次迭代之后检查测试条件,保证至少能执行一次循环体中的内容。
1.do while循环的通用形式如下:
do{
循环体 }while();注:do while语句以分号结尾
注释:do-while 循环的执行流程:首先无条件地执行一次循环体,然后再根据循环控制表达式的值来判断是否继续执行循环体。若为真,则继续执行;若为假,则停止执行,退出 do-while 循环。也就是说,do-while 循环至少会执行一次循环体。
那么我们该如何区别While和do while呢。前面我写过一篇文章关于while和do while的文章,见下:
深探 while 与 do while
注:用关系运算符和表达式比较大小
循环经常要用到测试表达式来作比较,这样的表达式称为关系表达式。出现在关系表达式中间的运算符叫做关系运算符。相关关系运算符如下:
既然说到关系运算符,那我们来讲讲运算符的优先级
关系运算符的优先级比算术运算符低,比赋值运算符高。相关的运算符优先级表这里就不放出来了,比较长,感兴趣的可以去百度搜一下。
for作为最后出场的老大,也算是三个老大里出场最多的了。为什么怎么说呢,因为它好用嘛,对不对,因为好用才经常出现在C语言的代码中。
1.for循环的通用形式如下:
for(表达式1;表达式2;表达式3){
循环体}
注释:for循环后面的括号里有三个表达式,分别用两个分号隔开。第一个表达式是初始化,只会在循环开始时执行一次;第二个为测试条件,在执行循环之前对表达式求值;如果为假,循环结束,否则继续执行第三个语句并继续循环。
for循环的第一个表达式给计数器赋值,第二个表达式表示计数器的范围,第三个表达式递增或者递减计数器。
for循环之所以好用,也是因为它的灵活性。并且还有如下九种用法:
-
可以使用递减运算符来递减计数器
-
可以让计数器递增2,10等
-
可以用字符代替数字计数
-
除了测试迭代次数外,,还可以测试其他条件
-
可以让递增的量几何增长,而不是算术增长
-
第三个表达式可以使用任意合法的表达式
-
可以省略一个或多个表达式(但不能省略分号),只要在循环中包含能结束循环的语句即可
-
第一个表达式不一定是给变量赋初值,也可以使用printf()
-
循环体中的行为可以改变循环头中的表达式
我们在使用循环时该如何选择使用哪一种语句呢?
首先,我们得先确定是需要入口条件循环还是出口条件循环。一般我们都是入口条件循环用的次数较多。这是因为按照一般原则是在执行循环之前测试条件比较好,而且测试放在循环的开头可使程序的可读性更高。还有就是在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。
我们平常用得最多的还是入口条件循环,那么在入口条件循环中我们该如何选择是使用for语句还是while语句呢?这个就取决于个人喜好啦,原因是两者可以互补,for语句和while语句大多数情况下都是可以互相替换的。
相信你学到这里或多或少都对循环有了一定的了解,想要更好的理解循环,建议多看几遍哦。这也是经过多次阅读书籍从而整理出来的循环里最重要的一些知识点。