闰年判断需满足:①能被400整除是闰年;②能被100整除但不能被400整除不是闰年;③能被4整除但不能被100整除是闰年;④其余都不是闰年。应避免简单写year%4==0,推荐分层if-else实现,并注意负年份无效。

闰年判断的数学规则必须先写对
直接套用“能被4整除就是闰年”会出错——2100年不是闰年,但能被4整除。C++里没内置闰年函数,得自己写逻辑,核心是这三条:
① 能被400整除 → 是闰年
② 不能被400整除,但能被100整除 → 不是闰年
③ 不能被100整除,但能被4整除 → 是闰年
④ 其他情况 → 不是闰年
别图省事合并成 (year % 4 == 0),否则百年年份全错。
用 if-else 链写最清晰,别硬塞三目运算符
有人喜欢一行写完:return (year % 4 == 0) ? (year % 100 != 0 || year % 400 == 0) : false;——可读性差,调试时连断点都难打。实际开发中更推荐分层判断:
bool isLeapYear(int year) {
if (year % 400 == 0) return true;
if (year % 100 == 0) return false;
if (year % 4 == 0) return true;
return false;
}
好处是:每条路径意图明确;加日志或断点方便;编译器优化后性能没差别。
注意输入范围和负数年份处理
Gregorian历法从1582年开始,但题目没限定年份范围。C++里int可能为负,而负年份(如公元前200年)按现行规则不适用闰年定义。常见错误是忽略这点,导致-4、0等输入返回意外结果:
立即学习“C++免费学习笔记(深入)”;
year 建议直接返回 <code>false或抛异常,别参与计算- 如果业务需要支持儒略历(1582年前),得额外加判断分支,和当前逻辑无关
- 用
unsigned int看似安全,但容易引发隐式转换问题(比如传入-1会转成大正数)
测试时别漏掉边界年份
光测2000、2004、2100不够。真正容易暴露逻辑漏洞的是这些:
-
1900→ 应返回false(被100整除但不被400整除) -
2000→ 应返回true(被400整除) -
1600→ 同样是true,验证400规则是否生效 -
1700、1800、2100→ 全该是false -
INT_MIN或-100→ 看是否提前拦截
闰年逻辑看着简单,错一个条件符号或少一层判断,整个分支就偏了。最稳妥的做法,是把四条数学规则原样翻译成四段 if,别合并、别省略、别靠“应该没问题”蒙混。











