You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语言变量作用域导致的逻辑错误:

  1. do-while循环外部声明的变量i,才是循环终止条件i>16 || i<13实际读取判断的变量。
  2. do循环体第一行重新声明了同名局部变量long long i = 0;,这个变量的作用域仅限do代码块内部。
  3. 后续内层while循环修改的、你用printf打印观测到的i,全是这个do块内部的局部i;外层被终止条件引用的i从始至终没有被修改过,一直保持初始值0。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:48:50