闰年判断标准为:能被4整除但不能被100整除,或能被400整除,表达式为(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0),需确保year为正整型并校验范围。

判断闰年的标准逻辑怎么写
闰年判断不是简单看能不能被 4 整除,C++ 里必须严格按规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。写成表达式就是 (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)。
常见错误是只写 year % 4 == 0,这会让 1900、2100 这类世纪年份误判为闰年——它们能被 4 和 100 整除,但不能被 400 整除,所以不是闰年。
注意:年份变量必须是整型(int 或 long),负数或 0 年份不参与公历闰年计算,实际使用中建议加范围校验(比如 year > 0)。
用 std::cin 输入年份后直接判断的写法
练习时最常遇到的是输入一个年份,输出“是闰年”或“不是闰年”。关键点在于别忘了读入后立刻做合法性检查,避免后续运算出错。
立即学习“C++免费学习笔记(深入)”;
示例片段:
int year;
std::cin >> year;
if (year <= 0) {
std::cout << "年份必须为正整数\n";
} else if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
std::cout << "是闰年\n";
} else {
std::cout << "不是闰年\n";
}
这里没封装函数,适合初学练习;若要复用,应把判断逻辑抽成 is_leap_year(int year) 函数。
为什么 % 运算符顺序和括号不能乱加
% 是左结合、同级优先级高于 == 和 !=,但低于 !,所以 year % 100 != 0 没问题,而 !(year % 100) == 0 就错了——它等价于 (!(year % 100)) == 0,即把取余结果转布尔再比较,逻辑完全跑偏。
容易踩的坑包括:
- 漏掉外层大括号,导致
&&和||优先级混淆 - 用
=代替==,编译可能不报错但逻辑恒假/恒真 - 对负数年份直接取模,C++ 中负数取模结果符号依赖实现(C++11 起规定向商截断,但最好避免)
在 C++11 及以后用 constexpr 写编译期判断
如果年份是字面量或 constexpr 变量(比如 constexpr int y = 2024;),可以提前在编译时算出结果,减少运行时开销。
写法示例:
constexpr bool is_leap_year(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
static_assert(is_leap_year(2000), "2000 应该是闰年");
static_assert(!is_leap_year(1900), "1900 不是闰年");
注意:constexpr 函数参数必须是字面量类型,且所有分支必须能被编译器静态求值;运行时传入普通变量会退化为普通函数调用。
真正容易被忽略的是:闰年规则只适用于格里高利历(现行公历),1582 年前的年份不适用这套逻辑,但练习题通常默认处理 1583 年之后的正整数年份。









