我在看K & R,下面的代碼會讓我困惑。有人可以向我解釋嗎請。提前致謝。此值分配如何工作?
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
我在看K & R,下面的代碼會讓我困惑。有人可以向我解釋嗎請。提前致謝。此值分配如何工作?
int leap;
leap = year%4 == 0 && year%100 !=0 || year%400 == 0;
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;
它的常識是閏年每四年發生一次,但是較少的人可能意識到捕獲的額外條件這個說法。 http://en.wikipedia.org/wiki/Leap_year#Algorithm –
@AtomicToothbrush雖然這是通常的情況,你說額外的檢查(例如世紀檢查爲例)是重要的,因爲1900年不是閏年,儘管1896年和1904年。 – Nobilis
的意圖是將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.
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
希望的解釋是明確的,它幫助。
它將返回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,以免混淆。在這種情況下,您不會發現任何混淆,因爲優先級從左到右。
這就是語句將如何執行。
%, ==, !=, &&, ||
在C中,'||'和'&&'運算符的結果是'1'或'0',而不是'true'或'false'。 – dreamlax
@dreamlax我說這是爲了解釋的目的。我編輯過它。 –
好的,你已經有了一些不錯的答案。
總之,
%
給其餘
&&
是邏輯與操作
變量leap
評估爲1
如果條件成立否則真0
這裏是另一種方式來計算閏年:
leap = ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0));
感謝您提供一種新的方式 – AuA
你需要了解什麼? 什麼是閏年,什麼是'%'操作符或如何評估'leap'? – P0W
爲什麼這是一個很好的問題?如果您擁有K&R,那麼您可以前往解釋操作員的部分,拿起一支鉛筆和一張紙並製作出來。 – 2013-07-26 04:22:49
@ H2CO3我瞭解操作員和閏年,但這個沒有括號的作業對我來說是新的。 – AuA