这些 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))
都不满足
在 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
||
这个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))
都不满足