日期推算程序Bug求助:4/6/9/11月任意日期跳至下月1日
修复C++日期次日计算程序的逻辑错误
你的程序处理4、6、9、11月任意日期时都会直接跳转到下月1号,核心问题是逻辑运算符优先级导致的条件判断错误。
看这段代码:
else if (day == 30 && month == 4 || month == 6 || month == 9 || month == 11)
由于&&的优先级比||高,这个条件会被编译器解析成:(day == 30 && month == 4) || month == 6 || month == 9 || month == 11
意思是:只要月份是6、9、11,不管输入的日期是几号,这个条件都会成立,直接执行跳转到下月1号的逻辑——这就是你遇到的问题根源。
同样,第二个else if分支也有相同的优先级问题:
else if (day == 31 && month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10)
会被解析为(day == 31 && month == 1) || month == 3 || ...,导致3、5等大月的非31号日期也会错误跳转,只是你没遇到这种场景而已。
另外,二月的处理完全没考虑闰年,比如2020年2月28日的次日应该是29日,当前逻辑直接跳转到3月1日,这也是需要补上的bug。
修复后的完整代码
#include <iostream> using namespace std; // 判断闰年的辅助函数 bool isLeapYear(int year) { if (year % 400 == 0) return true; if (year % 100 == 0) return false; if (year % 4 == 0) return true; return false; } int main() { cout << "What is the day after the date you enter?:"; int day, month, year; cin >> day >> month >> year; if (day == 31 && month == 12) { day = 1; month = 1; year += 1; } // 给月份判断加括号,确保逻辑先判断所有月份条件,再和day==31做与运算 else if (day == 31 && (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10)) { day = 1; month += 1; } // 同理,给4/6/9/11月的判断加括号 else if (day == 30 && (month == 4 || month == 6 || month == 9 || month == 11)) { day = 1; month += 1; } // 单独处理二月,区分闰年和平年 else if (month == 2) { if (isLeapYear(year)) { if (day == 29) { day = 1; month += 1; } else { day += 1; } } else { if (day == 28) { day = 1; month += 1; } else { day += 1; } } } else { day += 1; } cout << "The day after the date you entered is: " << day << "/" << month << "/" << year << endl; system("pause"); // 注意把return 0放后面,不然这行代码不会执行 return 0; }
关键修复点
- 给所有混合
&&和||的条件加上括号,确保逻辑判断符合预期; - 添加
isLeapYear函数,正确处理闰年2月的日期计算; - 调整
system("pause")的位置到return 0之前,否则这行代码永远不会执行。
内容的提问来源于stack exchange,提问作者Radu
相关产品推荐
相关产品推荐

