I'm reading K&R and the following code confuses me. Can someone explain it to me please. Thanks in advance.
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
I'm reading K&R and the following code confuses me. Can someone explain it to me please. Thanks in advance.
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
leap
被赋值为条件表达式的结果。
在它周围加上括号可能会更容易理解:
leap = ((year % 4 == 0) && (year % 100 !=0) || (year % 400 == 0));
如果这没有评估为真,您将得到 0,否则为 1。
例如,year = 2012
您会得到以下信息:
(year % 4 == 0)
- 这是真的,所以这等于 1
( year % 100 != 0)
- 这不是真的,所以再次等于 1
(year % 400 == 0)
- 不正确且等于 0
然后用它们的值替换这些表达式,我们得到:
leap = 1 && 1 || 0;
- 这给了我们1;
目的是将 1 分配给leap
ifyear
是闰年,将 0 分配给leap
ifyear
不是闰年。
year
如果能被 4 整除且不能被 100 整除,或者能被 400 整除,则为闰年year
。否则,不能。作业的右侧是这个闰年规则的 C 代码翻译。
year%4 == 0
如果year
能被 4 整除,则为真
&&
。是和。
year%100 !=0
如果year
不能被 100 整除,则为真。
||
是或。
year%400 == 0
如果year
能被 400 整除,则为真。
它将返回 true(1) 或 false(0)。您甚至可以将您的飞跃设置为布尔值。
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
假设您的年份是 2000 年。
leap = 2000%4 == 0 && 2000%100 !=0 || 2000%400 == 0
leap = true(1) && false(0) || true(1)
leap =false(0) || true(1)
leap = 1;
始终使用括号以避免混淆。在这种情况下,您不会发现任何混淆,因为优先级是从左到右的。
这就是语句的执行方式。
%, ==, !=, &&, ||
好吧,你已经得到了一些不错的答案。
简而言之,
%
给出余数
&&
是逻辑与运算
变量leap
评估1
条件是否为真,否则0
这是另一种计算闰年的方法:
leap = ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0));
基本上,条件的结果被分配给jump。
操作顺序很简单
1.
year%4 == 0
2.
year%100 !=0
3.
Result from 1 && Result from 2
4.
year%400 == 0
5.
Result from 3 || Result from 4
6.
leap = Result from 5
希望解释清楚,并有所帮助。