闰年判断必须用 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0),避免世纪年误判;应封装为 inline bool 函数,注意范围校验与 c++标准兼容性。

闰年判断的数学逻辑必须严格按规则写
不是所有能被4整除的年份都是闰年,C++里如果只写 year % 4 == 0,2100、1900这类世纪年会误判为闰年。标准规则是:能被4整除但不能被100整除,或者能被400整除。
实操建议:
- 用单个布尔表达式一次性判断,避免嵌套
if带来可读性或漏条件风险 - 注意运算符优先级:
&&优先级高于||,所以括号不能省——(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) - 输入年份建议做范围校验(比如
year >= 1),避免负数或0导致逻辑异常(虽然数学上0年存在争议,但实际业务中极少处理)
封装成函数比重复写表达式更安全
每次需要判断都手敲一长串条件,容易抄错、漏括号、搞混 != 和 ==。直接封装成内联函数,既清晰又利于复用和测试。
示例:
inline bool is_leap_year(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
说明:
- 用
inline避免函数调用开销(现代编译器通常自动内联,但显式声明更明确) - 参数类型选
int足够,年份不会溢出;不推荐unsigned int,因为用户可能传入负值,需统一处理而非让 unsigned 自动回绕 - 返回
bool,语义清晰,避免用int返回 0/1 增加理解成本
注意 std::chrono 不提供闰年判断接口
有人会查 std::chrono 库,以为里面有现成函数。实际上 C++20 的 std::chrono::year 类型虽支持 is_leap() 成员函数,但它要求传入的是 std::chrono::year 对象,不是裸 int,且仅在 C++20 及以上可用。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
如果你的项目受限于 C++17 或更早,或者只是简单验证一个整数年份,别绕路去构造 std::chrono::year{year}.is_leap()——它底层做的还是同样那行布尔运算,徒增依赖和转换成本。
关键点:
- C++17 及以前:老老实实自己写表达式或函数
- C++20+ 且已用
std::chrono时间处理:可以考虑std::chrono::year{y}.is_leap(),但注意它对非法年份(如year{0})行为是未定义的 - 不要为了用新特性而改整体时间模型,简单问题保持简单
边界年份测试不能只靠 2000、2024
写完函数马上测 2000(是)、2024(是)、2023(否)远远不够。闰年规则的“例外中的例外”集中在世纪年,最容易暴露逻辑漏洞。
必须覆盖的测试用例:
-
is_leap_year(2000)→ true(400 整除) -
is_leap_year(1900)→ false(100 整除但非 400) -
is_leap_year(2100)→ false(同上) -
is_leap_year(2024)→ true(普通闰年) -
is_leap_year(1999)→ false(普通平年)
少测任何一个世纪年,上线后遇到财务系统按天计息、日志归档跨年等场景,就可能因多算或少算一天出问题。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










