C语言程序中min变量始终输出0,求问题排查与解决建议
问题排查与修复方案
核心问题
你代码里的max和min是局部变量,C语言里局部变量不手动初始化的话,会拿到栈上的随机垃圾值。你看到min一直输出0,只是这次运行时栈上对应位置刚好是0,而你输入的分数都比0大,导致if(marks < min)的条件从来没触发,min就一直保持初始的0。其实max的结果也不可靠,只是没暴露出问题而已。
修复方法
- 用第一个输入的分数初始化max和min:
先读第一个分数,直接把它赋值给max、min和sum,再循环读剩下的分数。修改后的代码如下:
#include <stdio.h> #include <stdlib.h> int main() { int marks, i, max, min, sum = 0; float avg; // 先读第一个分数,初始化max、min、sum printf("INPUT marks 1:"); scanf("%d", &marks); sum = marks; max = marks; min = marks; // 读剩下的1个分数(总共要读2个) for(i = 1; i < 2; i++) { printf("INPUT marks %d:", i+1); scanf("%d", &marks); sum += marks; if (marks > max) max = marks; if(marks < min) min = marks; } avg = (float)sum / 2; // 强制转成float,避免整数除法丢小数 printf("marks:%.2f\n", avg); printf("max:%d\n", max); printf("min:%d\n", min); return 0; }
- 顺便修复平均值的问题:
原代码里avg=sum/2是整数除法,比如sum是3的话,结果会是1而不是1.5。把sum强制转成float再除以2,才能得到正确的浮点平均值。
额外排查技巧
- 调试时可以在初始化后、每次循环结束后打印
max和min的值,看看它们有没有按预期更新,就能快速判断条件是否触发。 - 记住:局部变量不会自动变成0,必须手动初始化后再用,不然会出现各种莫名其妙的问题。
内容的提问来源于stack exchange,提问作者Tanuj Malinda
相关产品推荐
相关产品推荐

