You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日期推算程序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;
}

关键修复点

  1. 给所有混合&&和||的条件加上括号,确保逻辑判断符合预期;
  2. 添加isLeapYear函数,正确处理闰年2月的日期计算;
  3. 调整system("pause")的位置到return 0之前,否则这行代码永远不会执行。

内容的提问来源于stack exchange,提问作者Radu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:55:19