在今天的学习中,我认识到了while/for/do while的循环语句,其中最常用的for语句的学习一解我之前在学校听课时对阶乘求解的疑惑。

  这得先从for循环的嵌套使用说起,宏观上来说for循环嵌套使用后循环的先后顺序实际上是由内而外的,细究原理,实际上是由外而内进发的,如下图所示求1-10的阶乘相加和,外层for循环先访问i= 1的初始化条件,而后判断i<= 10的判断条件是否成立,显然1<10成立,所以进入循环,而循环内部包含着更深的循环,这里称j循环吧,先访问j=1的初始条件,而后判断j<i的条件是否成立。

   既然讨论到j<i了,可能就有点难理解了(i think)这里说下原理吧,内层循环单独计算某个数的阶乘,外层循环将阶乘结果依次相加,这里的i就可以由外层循环累计所得,i=1时,外层第一次循环,内层计算1的阶乘,而后内层循环计算出结果保存到sum中,而后外层循环累加得i=2,继续内层循环进行2的阶乘的运算······以此类推累加完1-10的阶乘和后保存到total中储存,最后打印出来

初始c语言--分支结构-循环语句_嵌套

然而结果真的是这样吗?

nonono!

运行出来结果是错误的。

这曾经让我百思不得其解,我并没有找到我逻辑上还是代码上有什么漏洞。

哈哈哈但是今天我发现了!

真相就是!内层循环出错了,我们来捋一下,若i=1进行第一次循环,则j=1,j<=1成立,计算1的阶乘保存到了sum中·,而后i=2第二次循环,注意!j初始化等于1,判断条件变成了j<=2,计算2的阶乘,到这里sum = 1! * 1 * 2;看似计算出来的还是2的阶乘,因为值等于2,实际上我们继续走下去,i=3,第三次循环,此时再次进行内层循环,j=1,j<=3(意味着内层循环进行三次),sum=1!1*2*1*2*3!!!注意看这就是问题所在,第三次单独计算的sum本应该是3!=12*3,但多了一个1!1*2实际上就是1!*2!哈哈是不是看出来了,sum出的问题,sum会保留上次计算的阶乘值然后累积相乘,这样会影响下一个顺位相加阶乘的计算值,最终导致程序结果出错!

so!这里要对sum的结果进行初始化(或者说销毁上一轮数据),即在内层循环的for语句中初始化条件中多加一个sum = 1即可

运行一下!问题完美解决!

初始c语言--分支结构-循环语句_初始化_02

总结,学习还是要清楚原理,这样才能学以致用,不会出错,建议使用for循环有问题的友友们可以再次去搞清楚for循环的三个关键句--初始化+判断语句+调整,以及运行原理--先进入初始化,后判断条件是否为真(非0)而后进行循环,最后返回累加!

ok,over!!!