我正在阅读K& R,以下代码让我感到困惑。请有人向我解释一下。提前谢谢。
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
答案 0 :(得分:12)
leap
被赋予条件表达式的结果。
在它周围加上括号可能会让它更容易理解:
leap = ((year % 4 == 0) && (year % 100 !=0) || (year % 400 == 0));
如果不评估为真,则为0,否则为1。
E.g。对于year = 2012
,您可以获得以下内容:
(year % 4 == 0)
- 这是真的,所以这等于1
(year % 100 != 0)
- 这不是真的,所以再次等于1
(year % 400 == 0)
- 不是真,等于0
然后用这些表达式替换它们的值:
leap = 1 && 1 || 0;
- 让我们回到1;
答案 1 :(得分:3)
如果leap
是闰年,则意图指定1 year
,如果leap
不是闰年,则指定0到year
。
year
是闰年,如果它可以被4整除而不能被100整除,或者year
可以被400整除。否则,它不是。赋值的右侧是此闰年规则的C代码转换。
year%4 == 0
可被4整除,则 year
为真
&&
是和。
如果year%100 !=0
不能被100整除,则year
为真
||
是或。
如果year%400 == 0
可被400整除,则year
为真。
答案 2 :(得分:3)
它将返回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;
始终使用paranthesis避免混淆。在这种情况下,您不会发现任何混淆,因为优先级是从左到右。
这就是声明的执行方式。
%, ==, !=, &&, ||
答案 3 :(得分:1)
基本上,条件的结果被分配到 leap 。
操作顺序仅为
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
希望解释清楚,有帮助。
答案 4 :(得分:1)
好的,你已经得到了一些不错的答案。
简而言之,
%
给出了余数
&&
是逻辑AND操作
变量leap
如果条件成立,则评估为1
,否则为0
这是计算闰年的另一种方法:
leap = ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0));