使用三元运算符(无循环)在C语言中找最大负数、最小正数的问题排查
问题原因与修复方案
你的代码在获取最大负数时出错,核心问题是初始值设置不合理:
当输入的第一个数是正数(比如示例中的1),max会被初始化为0。但所有负数都小于0,后续判断b < 0 && b > max时,b > max(比如-2>0)永远不成立,导致max始终保持0,不会被任何负数更新。
同样的,如果输入第一个数是负数,mmin会被初始化为0,后续正数都大于0,b < mmin也永远不成立,mmin会一直是0,这也是潜在的bug。
修复方案
给max和mmin设置合理的初始值:
- 找最大负数时,初始值设为最小整数
INT_MIN,这样任何负数都比它大,只要遇到负数就能更新;如果第一个数是负数,直接用它初始化。 - 找最小正数时,初始值设为最大整数
INT_MAX,这样任何正数都比它小,只要遇到正数就能更新;如果第一个数是正数,直接用它初始化。
需要引入头文件<limits.h>来使用INT_MIN和INT_MAX,修复后的代码如下:
#include <stdio.h> #include <limits.h> int main() { int a, b, c, d, e, f; scanf("%d %d %d %d %d %d", &a, &b, &c, &d, &e, &f); int max = (a < 0 ? a : INT_MIN); int mmin = (a > 0 ? a : INT_MAX); max = (b < 0 && b > max ? b : max); max = (c < 0 && c > max ? c : max); max = (d < 0 && d > max ? d : max); max = (e < 0 && e > max ? e : max); max = (f < 0 && f > max ? f : max); mmin = (b > 0 && b < mmin ? b : mmin); mmin = (c > 0 && c < mmin ? c : mmin); mmin = (d > 0 && d < mmin ? d : mmin); mmin = (e > 0 && e < mmin ? e : mmin); mmin = (f > 0 && f < mmin ? f : mmin); printf("The max negative number is: %d\n", max); printf("The min positive number is: %d\n", mmin); }
测试输入1 -2 3 -4 5 -6时,max初始为INT_MIN,处理b=-2时,-2 > INT_MIN成立,max更新为-2;后续的-4、-6都比-2小,不会改变max,最终输出最大负数为-2,最小正数为1,符合预期。
内容的提问来源于stack exchange,提问作者Minh Công Nguyễn
相关产品推荐
相关产品推荐

