请解释这段C语言闰年判断代码逻辑,我尝试的if else写法无效
解释闰年判断代码的运行逻辑,以及if-else写法的常见问题
Hey there! Let's break down this concise leap year checking function and figure out why your if-else attempt might have hit a snag.
先看原代码的核心逻辑
首先,这个函数isLeapYear接收一个整数年份year,直接返回一个逻辑表达式的结果(C语言中,真用1表示,假用0表示):
#include <stdio.h> int isLeapYear(int year) { return ((!(year % 4) && year % 100) || !(year % 400)); }
我们把这个表达式拆成几个部分来理解,对应国际通用的闰年判断规则:
规则1:能被4整除,但不能被100整除的年份是闰年
!(year % 4):year % 4计算年份除以4的余数,余数为0时结果是0,!取反后变成1(真),这一步判断年份能被4整除。&& year % 100:逻辑与&&要求两边都为真才成立,year % 100的结果不为0时表示年份不能被100整除。- 把这两部分结合起来,
!(year % 4) && year % 100就对应了“能被4整除但不能被100整除”的闰年情况。
规则2:能被400整除的年份是闰年
!(year % 400):和前面同理,year % 400余数为0时,取反后为真,代表年份能被400整除,这类整百年(比如2000年)也是闰年。
逻辑或||的作用
整个表达式用||连接两个规则,意思是:只要满足规则1,或者满足规则2,这个年份就是闰年。如果两个规则都不满足,就不是闰年。
为什么你的if-else写法可能失败?
很多人用if-else写的时候容易踩逻辑顺序或者条件遗漏的坑,比如:
- 只判断了“能被4整除”,忽略了整百年需要被400整除的规则(比如1900年能被4整除,但不是闰年);
- 逻辑顺序搞反,先判断整百年的情况再判断普通闰年,或者条件写反(比如把
year%100 !=0写成year%100 ==0)。
给你一个正确的if-else版本,和原代码逻辑完全一致:
int isLeapYear(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; // 是闰年 } else { return 0; // 不是闰年 } }
你可以对比一下自己的代码,看看是不是漏了某个条件或者逻辑顺序出错了。
内容的提问来源于stack exchange,提问作者Saurav Shrestha




