这些 return 条件在布尔函数中有什么作用?

What do these return conditions do in a Boolean function?

在 codecademy 上有一门关于 C 的课程,其中包括一个关于如何制作日历的项目。该项目包含一个布尔函数,用于确定给定年份是否为闰年。代码:

bool is_leap_year(int year) {
    return (year % 4 == 0 && (year % 100 || year % 400 == 0));
}

鉴于我对运算符和 return 语句的初学者理解,我对这段代码的解读是:“如果给定年份可以被 4 AND 100 OR 400 整除,则该年份将是闰年。” 但这意味着 1992 年不是闰年,而 1900 年是,这显然是错误的。

为什么我运行输入这些年的代码,竟然return答对了?

你似乎在想

x || y == 0

表示

x == 0 || y == 0

但事实并非如此。

x || y == 0 并不意味着“x 或 y 等于零”。

x || y == 0表示“x,或y等于0”。

说得更清楚,

x || y == 0 表示“(x) 为真或(y 等于零)为真”。

因为 true 在 C 中仅表示 non-zero,

x || y == 0

等同于

x != 0 || ( y == 0 ) != 0

这意味着公式检查年份 是否 不能被 100 整除。

year % 4 == 0 年份可以被 4 整除

year % 100 年份不能被 100 整除。

year % 400 == 0 年份可以被 400 整除。

(年份可以被 4 整除) and ( (年份不能被 100 整除) or (年份可以被 400 整除))

这通常如何用英语表达:

能被4整除但不能被100整除的为闰年,能被400整除的年份为闰年

计算方式如下:

year % 4 == 0 && (year % 100 || year % 400 == 0)
1992 % 4 == 0 && (year % 100 || year % 400 == 0)
       0 == 0 && (year % 100 || year % 400 == 0)
            1 && (year % 100 || year % 400 == 0)
            1 && (year % 100 || year % 400 == 0)
            1 && (1992 % 100 || year % 400 == 0)
            1 && (        92 || year % 400 == 0)
            1 &&                               1 
                                               1

|| 的 right-hand 一边,因为它的 left-hand 是真的。

这个return声明

return (year % 4 == 0 && (year % 100 || year % 400 == 0));

可以等价改写为

return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));

或喜欢

return (year % 4 == 0 && year % 100 != 0 ) || (year % 4 == 0 && year % 400 == 0));

条件是闰年可以被4整除并且不能被100整除或者不能被400整除。所以1992是闰年,因为它可以被4整除但不能被100整除。而1900不是a闰年因为虽然可以被4整除但是也可以被100整除但是不能被400整除。那就是这个条件(year % 4 == 0 && year % 100 != 0 )和这个条件(year % 4 == 0 && year % 400 == 0))都不满足