while循环条件无效时内部任务仍执行?C语言月份校验程序疑问
为什么我的C语言月份校验程序会重复要求输入有效月份?
你的代码
int monthcheck(int m) { int month = 0; while (m <= 0 || m > 12) { printf("Month must be between 1 and 12, re-enter month:"); scanf("%d", &m); } if (m == 2) { month = 1; // February } if (m==1||m==3||m==5||m==7||m==8||m==10||m==12) month=2; return month; } int main() { int m; printf("Enter month"); scanf("%d",&m); if (monthcheck(m)==0) printf("The month is valid"); else if (monthcheck(m)==1) printf("The month is february"); }
程序输出
Enter month-2 Month must be between 1 and 12, re-enter month:13 Month must be between 1 and 12, re-enter month:2 Month must be between 1 and 12, re-enter month:2 The month is february
问题原因
核心问题出在两次调用monthcheck(m),且C语言函数参数是传值传递:
- 第一次调用
monthcheck(m)时,函数内部的m是main函数中m的副本——你最初输入的-2会被复制一份到函数里,循环中修改的只是这个副本的值(最终改成了2),但main函数里的原始m变量依然是-2。 - 当执行到
else if (monthcheck(m)==1)时,你再次把原始的-2传给了monthcheck,函数会重新进入校验循环,要求你输入有效月份,直到你输入2才会退出循环并返回结果。
修复方案
方案1:只调用一次校验函数(推荐)
把monthcheck的返回值先存到变量里,再进行判断,避免重复调用:
int main() { int m; printf("Enter month"); scanf("%d",&m); // 只调用一次校验函数,保存结果 int checkResult = monthcheck(m); if (checkResult == 0) printf("The month is valid"); else if (checkResult == 1) printf("The month is february"); }
方案2:使用指针传参修改原始变量
如果希望main函数里的m也被更新为有效月份,可以用指针传递参数:
// 修改函数参数为指针 int monthcheck(int *m) { int month = 0; while (*m <= 0 || *m > 12) { printf("Month must be between 1 and 12, re-enter month:"); // 直接修改指针指向的原始变量 scanf("%d", m); } if (*m == 2) { month = 1; // February } // 用else if避免覆盖之前的赋值 else if (*m==1||*m==3||*m==5||*m==7||*m==8||*m==10||*m==12) month=2; return month; } int main() { int m; printf("Enter month"); scanf("%d",&m); // 传递变量地址 int checkResult = monthcheck(&m); if (checkResult == 0) printf("The month is valid"); else if (checkResult == 1) printf("The month is february"); }
额外优化点
原代码中第二个if会存在逻辑覆盖风险(比如后续调整条件时可能出错),建议改成else if让逻辑更清晰:
if (m == 2) { month = 1; // February } else if (m == 1||m == 3||m == 5||m == 7||m == 8||m == 10||m == 12) { month = 2; } // 其余月份(4、6、9、11)month保持0
内容的提问来源于stack exchange,提问作者Johnny K18 HCM
相关产品推荐
相关产品推荐

