4

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;
4

5 回答 5

12

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;

于 2013-07-26T03:41:08.337 回答
3

目的是将 1 分配给leapifyear是闰年,将 0 分配给leapifyear不是闰年。

year如果能被 4 整除且不能被 100 整除,或者能被 400 整除,则为闰年year。否则,不能。作业的右侧是这个闰年规则的 C 代码翻译。

year%4 == 0如果year能被 4 整除,则为真
&&。是和。
year%100 !=0如果year不能被 100 整除,则为真。
||是或。
year%400 == 0如果year能被 400 整除,则为真。

于 2013-07-26T03:41:05.180 回答
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;

始终使用括号以避免混淆。在这种情况下,您不会发现任何混淆,因为优先级是从左到右的。

这就是语句的执行方式。

%, ==, !=, &&, ||
于 2013-07-26T03:48:27.533 回答
1

好吧,你已经得到了一些不错的答案。

简而言之,

%给出余数

&&是逻辑与运算

变量leap评估1条件是否为真,否则0

这是另一种计算闰年的方法:

leap = ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0));
于 2013-07-26T03:53:35.133 回答
1

基本上,条件的结果被分配给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


希望解释清楚,并有所帮助。

于 2013-07-26T03:46:36.700 回答