2013-07-26 22 views
4

我在看K & R,下面的代碼會讓我困惑。有人可以向我解釋嗎請。提前致謝。此值分配如何工作?

int leap; 
leap = year%4 == 0 && year%100 !=0 || year%400 == 0; 
+0

你需要了解什麼? 什麼是閏年,什麼是'%'操作符或如何評估'leap'? – P0W

+5

爲什麼這是一個很好的問題?如果您擁有K&R,那麼您可以前往解釋操作員的部分,拿起一支鉛筆和一張紙並製作出來。 – 2013-07-26 04:22:49

+0

@ H2CO3我瞭解操作員和閏年,但這個沒有括號的作業對我來說是新的。 – AuA

回答

12

leap分配條件表達式的結果。

圍繞它把括號可能更容易一點遵循:

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

你會得到0,如果這沒有計算爲true,否則爲1。

E.g.爲year = 2012你會得到如下:

(year % 4 == 0) - 所以這是等於1

year % 100 != 0)這是真的 - 這是不是真的如此反覆等於1

(year % 400 == 0) - 不屬實,等於0

然後替換這些表情與他們的價值,我們得到:

leap = 1 && 1 || 0; - 這讓我們回1;

+4

它的常識是閏年每四年發生一次,但是較少的人可能意識到捕獲的額外條件這個說法。 http://en.wikipedia.org/wiki/Leap_year#Algorithm –

+2

@AtomicToothbrush雖然這是通常的情況,你說額外的檢查(例如世紀檢查爲例)是重要的,因爲1900年不是閏年,儘管1896年和1904年。 – Nobilis

3

的意圖是將1分配給leap如果year是閏年,以及0至leap如果year是不是閏年。

year是一個閏年,如果它可以被4整除並且不能被100整除,或者year被整除400,否則它不是。作業的右側是此閏年規則的C代碼翻譯。

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

1

基本上,條件的結果被分配到
操作的順序僅僅是

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 
 


希望的解釋是明確的,它幫助。

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,以免混淆。在這種情況下,您不會發現任何混淆,因爲優先級從左到右。

這就是語句將如何執行。

%, ==, !=, &&, || 
+0

在C中,'||'和'&&'運算符的結果是'1'或'0',而不是'true'或'false'。 – dreamlax

+0

@dreamlax我說這是爲了解釋的目的。我編輯過它。 –

1

好的,你已經有了一些不錯的答案。

總之,

%給其餘

&&是邏輯與操作

變量leap評估爲1如果條件成立否則真0

這裏是另一種方式來計算閏年:

leap = ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)); 
+0

感謝您提供一種新的方式 – AuA