C语言嵌套while循环变量是否丢值?斐波那契序列输出异常问题
核心结论
多层while循环嵌套不会导致变量无故丢失值。只要是同一作用域定义的变量,不管套多少层循环,只要你没主动通过赋值语句修改它,就会一直保持原有值。你的程序输出不符合预期,本质是嵌套循环的执行逻辑和斐波那契数列的计算要求不匹配,和变量值丢失没有关系。
问题根因拆解
我们拿输入num=10(期望输出10个斐波那契数,前2个0、1输出后,还需要计算8个后续值,计数器cont从0累加到7就该结束)为例,顺着你的代码执行流程走一遍就能看明白问题:
- 初始状态:
num1=0,num2=1,cont=0,已经输出0 1 - 第一次进入外层while循环(此时cont=0 < 8,满足循环条件):
- 计算
num1 = 0 + 1 = 1,输出1,cont自增为1 - 紧接着进入内层while循环(此时cont=1 <8,满足内层循环条件):
- 第一次跑内层:计算
num2 = 1 + 1 =2,输出2,cont自增为2 - 这时候内层循环条件依然满足(2<8),不会跳回外层循环,会持续在内层执行:
- 第二次跑内层:
num2 = 1 +2 =3,输出3,cont自增为3 - 第三次跑内层:
num2 =1 +3=4,输出4,cont自增为4 - 就这么一直循环下去,直到
cont涨到8,内层循环才会退出
- 第二次跑内层:
- 第一次跑内层:计算
- 计算
- 等内层循环跑完时,
cont已经到8,外层while的条件也不满足,整个循环直接结束。
整个内层循环执行过程中,num1的值一直停在第一次算出来的1,从来没被更新过,每次都是拿固定的1加不断变大的num2,算出来的结果自然是3、4、5、6…的连续数,根本不符合斐波那契数列「两个前项交替更新、共同参与下一项计算」的逻辑。
你写两层循环的初衷可能是想一次算num1、一次算num2,但你把第二次计算的逻辑写成了内层循环,它就不是只执行一次,而是会反复执行直到计数器到头,完全跳过了num1的更新步骤,删掉内层之后循环逻辑回到单轮交替更新的状态,自然就能输出正确结果。
正确实现参考
斐波那契数列的递推计算完全不需要嵌套循环,单循环就能实现,核心是每次迭代同步更新两个前项的值:
#include <stdio.h> int main() { int num, a = 0, b = 1, next; printf("Insert the amount of digits of the Fibonacci sequence you'd like to display: \n"); scanf("%d", &num); if (num <= 0) { return 0; } // 输出第一项 printf("%d ", a); for (int i = 1; i < num; i++) { printf("%d ", b); next = a + b; a = b; b = next; } return 0; }
内容的提问来源于stack exchange,提问作者WebPombo
相关产品推荐
相关产品推荐

