CS50 ps1:满足终止条件的do-while循环无法停止问题
问题描述
完成CS50课程PS1习题开发时遇到代码异常:编写的do-while循环始终无法终止,即便变量已满足预设的循环退出条件。已在多处添加printf语句追踪各环节运行结果,所有输出值均符合do-while循环的终止判定规则,但循环仍持续执行无法退出。
问题复现代码
#include <stdio.h> #include "cs50.h" int main(void) { long long i = 0 ; // 初始化i为0,避免随机值 do { long long i = 0 ; // 问题根源行 long long n = get_long_long("Enter the card number:"); printf("your card:%lli\n",n); while (n>0) { n=n/10 ; i=i+1 ; printf("the number now is:%lli\n",n); printf("level is:%lli\n",i); } printf("code ended-Digits are:%lli\n",i); } while (i>16 || i<13); printf("results reached"); }
故障原因
这是C语言变量作用域导致的逻辑错误:
- do-while循环外部声明的变量
i,才是循环终止条件i>16 || i<13实际读取判断的变量。 - do循环体第一行重新声明了同名局部变量
long long i = 0;,这个变量的作用域仅限do代码块内部。 - 后续内层while循环修改的、你用
printf打印观测到的i,全是这个do块内部的局部i;外层被终止条件引用的i从始至终没有被修改过,一直保持初始值0。 - 0永远满足
i<13的循环继续条件,所以循环永远不会终止。你观测到的符合退出规则的i值,根本不是终止条件实际读取的变量。
修复方案
- 删除do循环体内部的
long long i = 0;变量声明语句,不要在内层作用域声明和外层同名的变量。 - 每次进入do循环时,直接给外层的
i赋值为0做重置,避免上一轮计算的卡号位数累加到下一轮,导致位数判断错误。
修复后的核心逻辑参考:
int main(void) { long long i; do { i = 0 ; // 每次进入循环重置计数,不重新声明变量 long long n = get_long_long("Enter the card number:"); printf("your card:%lli\n",n); while (n>0) { n=n/10 ; i=i+1 ; printf("the number now is:%lli\n",n); printf("level is:%lli\n",i); } printf("code ended-Digits are:%lli\n",i); } while (i>16 || i<13); printf("results reached"); }
内容的提问来源于stack exchange,提问作者TechMasterMind
相关产品推荐
相关产品推荐

