为什么我的C语言闰年日期校验代码中int day的修改未触发预期逻辑?
错误原因及修复方案
核心问题:逻辑运算符使用错误
你写的1月日期校验条件存在逻辑错误:
原代码1月判断条件为(day > 1 || day < 31),这里用了或运算符(||),任意整数都必然满足「大于1」或者「小于31」,这个条件是恒成立的:
- 当你设置day=32时,
32>1为真,判断条件直接通过,执行打印逻辑,永远不会进入else分支的错误提示 - 同时你使用
>1和<31,会把合法的1号、31号误排除,边界判断错误
修复方案
1月校验逻辑修正
把或运算符改为且运算符(&&),同时修正边界:
//day (January) if ((month == 1) && (day >= 1 && day <= 31)) { printf("%d\n", day); }else{ if (month == 1) { printf("Error: Invalid day\n"); } }
2月校验逻辑同步修正
你写的2月校验存在完全相同的运算符错误,同时原来的闰年判断只覆盖了世纪闰年(能被400整除的年份),遗漏了普通闰年(能被4整除但不能被100整除的年份),修正后代码如下:
//February // 先判断是否为闰年 int is_leap = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); if (month == 2) { if (is_leap) { if (day >=1 && day <=29) { printf("%d\n", day); } else { printf("Error: Invalid day\n"); } } else { if (day >=1 && day <=28) { printf("%d\n", day); } else { printf("Error: Invalid day\n"); } } }
内容的提问来源于stack exchange,提问作者Pizzalovergoody
相关产品推荐
相关产品推荐

