运行C语言成绩统计代码时触发浮点异常的原因排查
C语言成绩统计程序运行异常的原因及修复方案
你的程序在VSCode中无输出直接终止、在线编译器报浮点异常,核心原因有两个:
1. 未初始化变量引发未定义行为
你声明了int pass, fail, spass, sfail, avg = 0;,但仅avg被初始化为0,pass、fail、spass、sfail的初始值是内存中的随机垃圾数据。当执行fail = fail + 1或sfail = score + sfail这类累加操作时,会基于垃圾值计算,导致程序行为不可预测,这也是VSCode中程序异常终止的潜在诱因。
2. 整数除以零触发浮点异常
循环终止条件是enteries != 0,循环结束后enteries的值必然为0。此时执行avg = sum / enteries;相当于整数除以0,这在C语言中属于未定义行为,会直接触发浮点异常——这就是在线编译器明确报错的原因,程序因此崩溃,无法输出结果。
此外还有一个潜在问题:若输入的成绩不在0-100范围内,enteries不会递减,循环会陷入死循环,但这不是当前崩溃的直接原因。
修复后的代码
#include <stdio.h> int main(){ int enteries; printf("请输入学生人数:"); scanf("%d", &enteries); // 初始化所有统计变量为0,避免垃圾值干扰 int pass = 0, fail = 0, spass = 0, sfail = 0, avg = 0; // 保存初始人数,用于后续计算平均值 int total_students = enteries; while (enteries != 0){ int score; printf("请输入成绩:"); scanf("%d", &score); // 校验成绩有效性,避免死循环 if (score < 0 || score > 100) { printf("无效成绩,请输入0-100之间的数值\n"); continue; } if (score < 60){ fail++; sfail += score; enteries--; } else{ pass++; spass += score; enteries--; } } int sum = spass + sfail; // 使用初始人数计算平均值,避免除以0 if (total_students != 0) { avg = sum / total_students; printf("平均成绩:%d\n", avg); } else { printf("未输入有效学生人数\n"); } return 0; }
修改说明
- 初始化所有统计变量为0,消除垃圾值对计算的影响。
- 新增
total_students保存初始学生人数,解决循环后enteries为0导致的除以零问题。 - 增加成绩范围校验,防止无效输入引发死循环。
- 增加边界判断,处理学生人数为0的特殊情况。
内容的提问来源于stack exchange,提问作者Geek
相关产品推荐
相关产品推荐

