while循环代码例子(C语言的while循环语句怎么理解它和递归有什么联系要注意什么吗)
本文目录
C语言的while循环语句怎么理解它和递归有什么联系要注意什么吗
谢邀。
我的上一个回答介绍了C语言的 “递归函数”,一行一行利用递归写出了求 n! 的C语言程序并分析了它的执行流程。
其实,每次递归调用都是在重复做同样一件事,都是计算 n x (n-1)!。当然了,虽说是“同样一件事”,还是略有不同的(n的值每次都不同),所以称呼其为“迭代”更恰当一点。
计算机特别擅长处理重复迭代的工作,这也是我们人类使用计算机的原因之一,因为人类最不擅长,也不喜欢重复迭代的工作。有了计算机,程序员通过编程告诉计算机怎样做就可以了。
C语言中的 while 循环语句
虽然迭代用递归可以解决,但是C语言的循环语句更符合我们人类的使用习惯,用起来更习惯,我们先来看看 C语言中的 while 语句。它的语法为:
while(条件表达式){ 语句;}到达 while 语句时,程序会判断“条件表达式”的真假,若假则跳过 while 语句块。若真,则执行 while 语句块里的内容,到达语句块末尾时,程序会回到“条件表达式”处,再次判断真假。
现在知道了 while 循环语句的用法,我们来用它计算 n 的阶乘,C语言代码可以如下写:
上面的C语言代码和之前利用递归求阶乘的代码,从某种程度上来说,是等价的。我们仍然以 factorial(3) 为例,说说这段C语言代码的执行流程。
程序第一次到达 while 处,n=3,显然大于 0,于是 result=1 x 3,接着 n=2;回到 while 处,n 依然大于 0,于是 result = 1 x 3 x 2;接着 n=1,回到 while 处,n 依然大于 0,于是 result = 1 x 3 x 2 x 1,接着 n = 0;回到 while 处,0 不大于 0,于是跳过 while 语句,factorial 函数返回 result = 6。
很多程序员习惯称呼 n 为循环变量,因为它控制着循环体是循环还是结束。
C语言的循环和递归
我在上一个回答中提到“递归和循环是常常是等价的”,这里就是一个例子。
但是要注意的是,递归和循环解决问题的思路不一样,用递归解决阶乘问题靠的是递推关系n!=n·(n-1)!,用循环解决这个问题则更像是把这个公式展开了:n!=n·(n-1)·(n-2)·…·3·2·1。
把公式展开了理解会更直观一些,所以有些时候循环程序比递归程序更容易理解。在整个递归调用过程中,虽然分配和释放了很多变量,但是所有的变量都只在初始化时赋值,没有任何变量的值发生过改变,而上面的循环程序则是通过对n和result这两个变量多次赋值来达到同样目的的。
再来说说使用 while 的注意事项
既然“递归和循环常是等价的”,而递归函数如果写的不恰当就会造成无限递归,导致程序最后崩溃,那对应的,while 循环语句如果写的不恰当,也会造成无限循环,程序员们常常称其为“死循环”。
造成 while 语句死循环的原因很简单,只要 while 的条件表达式不可能为假,程序跳不出 while 循环,就会导致C语言程序陷入“死循环”。
上面的C语言代码例子中,正整数 n 不断减 1,最后 n 必定会等于 0 的,因此 n》0 有为假的时刻,所以不会导致死循环。
但是,如果不小心把 n = n-1 这条语句漏掉了,那程序永远都不会跳出 while 循环体了。
不过与无限递归不同,程序一般不会因为死循环崩溃,而是会“卡死”在死循环处。所以,在使用 while 循环语句之前,要确保 while 的条件表达式有机会为假,除非,你故意希望有一个死循环。
不过,有时候死循环并不是那么一目了然的,例如下面这个著名的 3x+1 问题:
循环体所做的事情是:如果n是偶数,就把n除以2,如果n是奇数,就把n乘3加1。一般的循环变量要么递增要么递减,可是这个例子中的n一会儿变大一会儿变小,最终会不会变成1呢?
可以找个数试试,例如一开始n等于7,每次循环后n的值依次是:7、22、11、34、17、52、26、13、40、20、10、5、16、8、4、2、1。最后n确实等于1了。
许多世界难题都是这样的:描述无比简单,连小学生都能看懂,但证明却无比困难。读者可以再试几个数都是如此,但无论试多少个数也不能代替证明,目前世界上还无人能证明。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
C语言除了while,还有什么循环语句break和continue的区别是什么
谢邀。
C语言为了方便的让计算机执行很多次数的迭代运算,提供了循环语句,我的上一个回答较为详细的介绍了while循环语句,以及它与递归之间的关系。
的确,C语言还提供了其他两种循环语句,供不同的使用环境,和不同使用习惯的程序员使用。此外,C 语言还提供了 break 和 continue 关键字用于控制循环。下面将一一介绍。
先来说说C语言的 break 和 continue 关键字
break 和 continue 关键字的区别还是挺大的,它们的功能是不同的。当C语言程序的循环语句遇到 break 时,直接跳出整个循环体,而遇到 continue 时,则结束本次循环,开始一次新的循环。这么说有点虚,还是来看几个例子吧:
以上代码,while(1) 本应是个死循环,按理说,程序应该永远停在 while 循环语句里了。但是在 cnt 等于 3 的时候,C语言程序遇到 break,于是跳出循环体, printf() 将不再被执行。再来看看 continue 关键字:
代码很简单,就是把 cnt 依次从 0 加一加到 4,然后打印出它的值。程序最后输出:”1, 3, 4, “,少了 2 对不?
这是因为在 cnt 等于 2 的时候,直接就结束本次循环,跳到循环体开头的条件表达式了,也即 cnt 等于 2 的时候,printf() 语句被跳过了。
现在应该理解“当循环语句遇到 break 时,直接跳出整个循环体,而遇到 continue 时,则结束本次循环,开始一次新的循环。” 这句话了。
题主应注意“整个”和“本次”这两个词。另外要说明的是,break 和 continue 应作为独立的语句,要用 ;结尾。
现在明白了C语言循环控制关键字 break 和 continue 的功能和区别了,再来看看另外两种循环语句:do/while 循环语句,和 for 循环语句。
C语言的 do/while 循环语句
do/while 循环语句和 while 循环语句非常像,只是 do/while 循环语句把条件表达式放在后面,它的语法如下:
do{ 语句;}while(条件表达式);程序遇到 do/while 循环语句后,会先执行循环体里的语句,到末尾才判断条件表达式真假决定是否循环。
说到这里,就看出它与 while 循环语句的区别了:如果条件表达式为假,while 循环直接就被跳过了,不会执行;而 do/while 循环语句则至少执行一次循环。例如:
编译执行后,程序会输出 “do while”。使用 do/while 语句要注意的事项和 while 语句一致,只是还要确保 do/while 语句的最后 while后一定要有“;”,否则编译器无法判断这是一个do/while循环的结尾还是另一个while循环的开头。
再来说说C语言的 for 循环
先看看 for 循环的结构:
for(控制表达式1;控制表达式2;控制表达式3) 语句如果不考虑 continue(为什么呢,可以思考一下) ,则 for 循环等价于下面的 while 循环:
控制表达式1;while(控制表达式2) { 语句 控制表达式3;}下面用 for 循环来计算 n!,请看如下C语言代码:
题主可点我主页,查看我上一个回答中使用 while 循环语句计算n! 的C语言代码,对比和理解二者之间的差异。++i 的作用和 i+1; i=i+1; 一样,如果 i = 0,那么执行 a = ++i; 语句后,a 等于 1,i 也等于 1。类似还有 –i,表示自减。
现在来分析一下 for 语句:“i=1”,表示 for 循环体里的 i 从 1 开始;“i《=n”,表示如果 i《=n 为真,则循环,否则跳出循环;++i 表示每执行一次循环,就把 i 加一。
到这里,相信题主已经知道 C 语言循环语句一大家子和它的管家们(break,continue)了吧,要理解它们的区别其实很简单,只要把各个语句的功能和机制彻底弄懂,应该明白,C语言是一门极其重视基本功的编程语言。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
本文相关文章:

哪一个编程语言比较好?什么是pypl,以及tiobe-index的不同
2025年4月5日 03:30

java接口代码(不同编程语言的程序可不可以通过接口相互调用)
2025年4月1日 13:00

stakeholder theory(英语语言文学硕士毕业论文答辩一般会问什么问题)
2025年3月29日 17:00

在C语言中 z=x>y x: y; 这个表达式是什么意思啊,求解?if(i=a<ba:b;i>0;i--)啥意思
2025年3月29日 11:50

谭浩强c语言电子版(哪本书最适合初学电工电子比如初学C语言就用谭浩强C程序设计,单片机就郭天祥单片机)
2025年3月23日 06:30

易语言辅助论坛(请问想学写游戏脚本,是学易语言还是学按键精灵)
2025年3月18日 14:40

c语言和c加加先学哪个(c++是在c语言的基础上演变来的,那为何c++没有代替c语言呢)
2025年3月9日 22:20

编程学哪个语言好(现在学习编程,学那个语言简单点好学,好就业)
2025年3月9日 16:20

c语言程序设计第三版(软件工程大一新生,自学C语言用c程序设计第三版还行吗)
2025年3月7日 21:20

最容易学的编程语言(JAVA是不是目前最容易学最容易上手的编程语言)
2025年3月7日 05:30

c语言编译器安卓版(暑假打算写个基于安卓的C语言编译器,请教大佬该学习哪方面的知识)
2025年3月4日 04:30
更多文章:

面向对象模型的特点(什么是面向对象过程模型,有什么优点和缺点)
2025年3月31日 11:50

虚拟机怎么共享本机文件?vmware虚拟机,如何将本地主机的文件导入虚拟机
2025年3月24日 22:40

win10激活工具kms(KMS Tools怎么激活win10系统)
2025年4月3日 06:20

css样式表的三种引入方式(在网页中使用CSS 样式表的三种方式是什么)
2025年3月10日 18:40

dragon什么意思(dragon是什么意思端午节英语怎么说2、中国和国外所有的节日并译成英语)
2025年2月16日 19:30

wamp5是什么软件他的介绍是什么有什么用途是用来管理网站的吗?wamp5怎么使用,我是初学者,给点教程吧
2025年3月10日 04:20

rpcbind服务(Linux服务管理(如何关闭或禁用不需要的服务)
2025年3月14日 20:40

escapehtml(ecshop 中 escape:url,escape:html 什么意思,如何应用)
2025年2月9日 12:50

linux内核设计与实现(现在有些互联网公司并不是很好,什么样的程序员才能算“大牛”)
2025年3月13日 23:00

expanded是什么意思(英语“expand”是什么意思)
2025年2月23日 18:30