You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

请解释这段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

火山引擎 最新活动