C语言程序满足条件却触发else分支的问题排查
问题分析与解决:未初始化变量导致的计算异常
你的代码在输入1.90、1.90、1.90时触发非法提示,核心问题是变量average未初始化,并非float精度问题。
问题原因
C语言中,局部变量若未显式初始化,会存储随机的垃圾值。你的代码里仅声明了float average;,未赋予初始值,执行average+=height;时,是将输入的身高值加到随机垃圾值上,最终计算结果完全偏离预期,自然触发非法判断。
以输入三个1.90为例,正确计算应为:(1.9*3 + 2.06)/4 = 7.76/4 = 1.94
但因average初始为随机值,实际计算结果是(随机值 + 1.9+1.9+1.9 +2.06)/4,大概率不在1.900-2.100范围内。
修复方案
只需给average初始化0值即可:
float average = 0.0f;
修改后的完整代码:
#include <stdio.h> #include <stdlib.h> int main() { printf("Please enter the heights of 3 players\n"); float average = 0.0f; // 初始化变量 float height; for (int i=0; i<3; i++) { scanf("%f", &height); average+=height; } average = (average + 2.06)/4; // 无需强制转float,运算数已兼容 if (average<1.900 || average>2.100) printf("Illegal heights average, your average %.3f isn’t approved\n",average); else printf("Your heights average is %.3f, welcome to space jam tournament!!\n",average); return 0; }
额外提示
- 局部变量(包括int、float等基本类型)必须显式初始化,避免垃圾值引发的隐蔽逻辑错误。
- 原代码中的
(float)((average + 2.06)/4)强制类型转换是多余的,average为float类型,2.06为double类型,运算时会自动做类型提升,直接去掉转换更简洁。
内容的提问来源于stack exchange,提问作者Blabla
相关产品推荐
相关产品推荐

