闰年判断需满足“能被4整除且不能被100整除,或能被400整除”,1900不是闰年而2000是;应封装为isleapyear(int year)函数,返回bool,表达式为return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);获取当前年份须用系统时间而非硬编码或__date__宏,并注意std::localtime线程不安全,多线程下需用localtime_s或localtime_r并检查返回值。

闰年判断的数学逻辑必须写对
直接套用“能被4整除就是闰年”会出错——这是最常见的误判。公历闰年规则是:能被4整除但不能被100整除,或者能被400整除。
这意味着:1900不是闰年(被100整除但不被400整除),而2000是闰年(被400整除)。
实操建议:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
year % 4 == 0 && year % 100 != 0 || year % 400 == 0,注意运算符优先级——&&比||高,括号可加可不加,但加更安全 - 别用
year / 4 * 4 == year这类替代写法,既难读又无必要 - 输入
year必须是正整数;若可能为负或零,先做校验,否则行为未定义
封装成函数时注意参数和返回类型
别在主逻辑里重复写判断表达式。封装成isLeapYear(int year)最稳妥。
实操建议:
- 参数用
int足够(年份不会超过int范围),不用long或unsigned增加复杂度 - 返回
bool,语义清晰;避免返回int再靠调用方解释1/0 - 函数体一行即可:
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
获取当前年份别硬编码
如果目标是“判断今年是否为闰年”,就别手敲2024——得从系统时间读。
实操建议:
- 用
std::chrono+std::time_t最便携:auto now = std::time(nullptr); auto tm = *std::localtime(&now); int thisYear = tm.tm_year + 1900; -
tm.tm_year是从1900年起算的,不加1900会得到124这种结果,这是高频错误 - 别用
__DATE__宏(如"Jan 1 2024"),它在编译时固化,程序运行一整年都判同一个年份
边界情况和跨平台陷阱
std::localtime不是线程安全的,在多线程环境里要用std::localtime_r(POSIX)或std::localtime_s(MSVC),否则可能返回脏数据。
实操建议:
- Windows下优先用
std::localtime_s(&tm, &now),返回errno_t,失败时tm保持未初始化 - Linux/macOS用
std::localtime_r(&now, &tm),返回struct tm*,空指针表示失败 - 无论哪边,都要检查返回值是否有效,不能假设
localtime一定成功——比如时区配置损坏时会返回nullptr
真正容易漏掉的是时区和线程安全这两层。很多人只测了2024和1900就认为逻辑正确,但上线后在服务器上跑着跑着就返回false——其实是localtime在并发下调用崩溃或返回随机值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










