C语言非嵌套多if语句报错求助:sc_score仅返回5或6
问题排查与解决
核心问题分析
- 连续比较表达式写法错误
C语言不支持数学式的连续比较(如0 < nscore <= 50),编译器会将其解析为(0 < nscore) <= 50:
- 先计算
0 < nscore,结果为布尔值(真=1,假=0) - 再将这个结果与50比较,由于1或0都满足
<=50,所以只要nscore > 0,所有类似X < nscore <= Y的条件都会判定为真。 - 这导致所有小于100的输入会依次触发前面的
if,最终被最后一个if (80 < nscore <= 99)覆盖为5;只有输入100时会执行单独的条件,得到6。
- 独立
if导致赋值覆盖
多个独立if会依次检查所有条件,即使前面的条件已匹配,后续条件仍会执行并覆盖sc_score的值。改用else if可确保仅执行第一个匹配的条件,后续条件不再检查。
修正后的代码
#include <stdio.h> int main() { int nscore, sc_score; scanf("%d", &nscore); if (nscore > 0 && nscore <= 50) sc_score = 0; else if (nscore > 50 && nscore <= 60) sc_score = 1; else if (nscore > 60 && nscore <= 65) sc_score = 2; else if (nscore > 65 && nscore <= 70) sc_score = 3; else if (nscore > 70 && nscore <= 80) sc_score = 4; else if (nscore > 80 && nscore <= 99) sc_score = 5; else if (nscore == 100) sc_score = 6; // 处理无效输入(如<=0或>100),避免未初始化变量问题 else sc_score = -1; printf("%d", sc_score); return 0; }
额外建议
- 补充输入合法性判断:当
nscore不在0-100范围内时,设置特殊值(如-1)标识无效输入,避免未初始化变量引发的异常。 - 调整边界逻辑:根据实际需求调整条件边界,比如若需要包含50分,可将第一个条件改为
nscore >= 0 && nscore <= 50。
内容的提问来源于stack exchange,提问作者EintsWaveX
相关产品推荐
相关产品推荐

