C++中判断闰年的正确条件是(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0),必须加括号明确逻辑优先级,避免因&&优先于||导致1900等世纪年份误判。

闰年判断的数学规则必须严格对应代码逻辑
直接说结论:C++ 中判断闰年不能只靠 year % 4 == 0,否则 1900、2100 这类世纪年份会误判为闰年。真正有效的条件是「能被 4 整除但不能被 100 整除,或者能被 400 整除」——这个“或”是关键,必须用逻辑运算符 || 连接两个互斥分支。
if 中用 && 和 || 组合时括号不能省
常见错误是写成 year % 4 == 0 || year % 100 != 0 && year % 400 == 0,这会因运算符优先级出错(&& 优先于 ||),导致 2000 年可能被正确判断,但 1900 年反而通过。必须加括号明确语义:
bool isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
- 左侧括号保证「普通闰年」逻辑完整:能被 4 整除且不能被 100 整除
- 右侧括号保证「世纪闰年」独立成立:能被 400 整除
- 两个子表达式用
||连接,符合“二者满足其一即可”的业务含义
注意 year 的取值范围和类型安全
虽然格里高利历从 1582 年开始使用,但 C++ 代码本身不校验年份合理性。若 year 是 int 类型,需留意:
- 负数年份(如公元前)按模运算规则处理,
-1 % 4在 C++ 中结果为 -1,不等于 0,所以负年份默认不是闰年——这与历史历法不符,但多数业务场景不涉及 - 如果输入来自用户或文件,建议先做范围检查:
if (year 10000),避免无效计算 - 用
unsigned int可排除负数,但要注意year % 100 != 0在 year=0 时仍成立(0%100==0),而 year=0 不是有效公历年份
封装成函数后别忽略 const 和内联优化
实际项目中通常会封装为工具函数,这时几个细节容易被忽略:
立即学习“C++免费学习笔记(深入)”;
- 参数加
const int&或直接int(小整型传值开销小),避免意外修改 - 函数声明加
constexpr(C++11 起)可让编译器在编译期计算常量年份,比如constexpr bool isLeapYear(2000) - 若频繁调用,加
inline提示编译器内联,消除函数调用开销(现代编译器通常自动优化,但显式写出更稳妥)
最简可用版本长这样:
constexpr bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
真正难的不是写对一行表达式,而是想清楚「世纪年份的例外规则」怎么映射到布尔组合上——漏掉括号、搞反 &&/|| 优先级、忽略 0 或负数边界,都可能让测试用例在某一年突然翻车。









