判断闰年的核心条件是:能被4整除但不能被100整除,或者能被400整除。该规则精确区分常规闰年(如2024)、普通世纪年(如1900,非闰年)和世纪闰年(如2000,是闰年)。

判断闰年的核心条件是什么
闰年不是简单看能否被 4 整除,C++ 中必须严格按公历规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。漏掉任一条件都会错判,比如 1900 能被 4 和 100 整除,但不能被 400 整除,所以不是闰年;而 2000 是闰年。
用 if-else 写最清晰的判断逻辑
别用嵌套三目运算符硬凑一行,可读性和维护性差。直接拆成带注释的分支更稳妥:
bool isLeapYear(int year) {
if (year % 400 == 0) return true;
if (year % 100 == 0) return false;
if (year % 4 == 0) return true;
return false;
}
-
year % 400 == 0优先级最高,覆盖世纪闰年特例 -
year % 100 == 0紧随其后,排除普通世纪年(如 1900) -
year % 4 == 0放最后,处理常规闰年(如 2024) - 所有整数取模操作在 C++ 中对负数行为未定义,确保
year为正整数
用单个 return 表达式也行,但要注意运算符优先级
如果坚持写成一行表达式,必须加括号明确逻辑分组,否则 && 和 || 的结合性容易出错:
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
- 不加括号写成
year % 4 == 0 && year % 100 != 0 || year % 400 == 0语法合法,但易误读 -
&&优先级高于||,实际等价于上式,但靠记忆优先级不如显式括号可靠 - 该写法在 C++17 及以后无性能差异,编译器会优化成相同汇编
测试时容易忽略的边界年份
只测 2000、2024、2100 不够,这几个年份才是关键验证点:
立即学习“C++免费学习笔记(深入)”;
-
1600:能被 400 整除 → 是闰年(验证世纪闰年) -
1700、1800、1900:能被 100 整除但不能被 400 整除 → 都不是闰年 -
2024:能被 4 整除且不能被 100 整除 → 是闰年 -
0或负数:标准 C++ 不定义公元 0 年,输入前应校验非正年份是否允许
闰年逻辑本身很简单,真正容易翻车的是对“世纪年”和“400 年周期”的理解偏差,而不是代码写法。










