2012-07-12 60 views
0

有在C#中的一段代碼的程序員2010,我想知道的,那就是:模運算符的語義是什麼?

for (int i = 0; i < deck.Length; i++) 
{ 
    deck[i] = new Card(faces[i % 13], suits[i/13]); 
} 

我知道那算不算是在陣列內存插槽,而新卡把西服並且面向甲板並返回計數量。我不明白的是你怎麼模數化並分成零點?或者我誤解了?感謝

+0

所以,如果我得到這個權利,如果你正在做正確的模數,它應該只做1,2,3 ...直到它進入13,然後重複。那麼這個部門呢?那麼模數不會好嗎?他們爲什麼第二次使用部門? – user1192890 2012-07-12 01:13:51

+0

其實它確實是0,1,2 ... 12。 – Antimony 2012-07-12 05:01:13

+0

我正在談西裝。 – user1192890 2012-07-12 06:39:04

回答

1

0%13 = 0

0/13 = 0

它的簡單的數學。

+0

我想我現在得到的模數,它只是返回餘數,如果沒有餘數,它返回數字。我想我的下一個問題是,你如何劃分1到13的東西?還是兩個左右?我讚賞btw的幫助,但在零後我不知道如何將1除以13。我可以將它看作一個分數地址,但它仍然不會等於1。它如何能夠等同於一個完整的地址? – user1192890 2012-07-12 04:43:38

+0

@user 13進入1次零次,所以你有1%13 = 1 - (0 * 13)= 1。 – Antimony 2012-07-12 05:00:43

+0

我說的是suits[i/13]。我看到0/13 = 0,但大約1/13? – user1192890 2012-07-12 06:36:55

0

像模運算符是混淆了你,你沒有分成0,則表示將通過0 13 0/13 = 0

4

這個問題的聲音。模數(%)運算符會計算除法的餘數。它的結構與分部(分子/分母)相同。看起來你看到i % 13remainder of 13/i。那是錯的。它是remainder of i/13。所以,如果i爲零,取模運算符將返回0您是從未將我的應用。

一個例子是3/23/2是1和一半。但是,如果將該結果保存爲整數(無小數),則僅保存1。那一半去哪了?它被扔掉了。如果需要,可以將其保存爲floatdouble,或者使用模數運算符。 3%2會給你1,其餘的。下面是一個例子程序:

struct ModulusHelper 
{ 
    public int Quotient; 
    public int Remainder; 
    public ModulusHelper(int numerator, int denominator) 
    { 
     Quotient = numerator/denominator; 
     Remainder = numerator % denominator; 
    } 
} 

您可以使用它像這樣:

class Program 
{ 
    static void Main(string[] args) 
    { 
     ModulusHelper mod = new ModulusHelper(args[0], args[1]); 
     Console.WriteLine("Quotient: {0}", mod.Quotient); 
     Console.WriteLine("Remainder: {0}", mod.Remainder); 
     Console.ReadKey(); // BATCH `pause` 
    } 
} 
+2

你的「優化技巧」實際上並不是一種優化。當運行時檢測到你有一個固定長度的數組被迭代時,它將內聯調用到'.Length'。您實際上可以獲得輕微的性能優勢,因爲它也可以在某些情況下移除邊界檢查。 – 2012-07-12 00:49:28

+0

在改變大小時迭代數組通常被認爲是不好的編程習慣。如果你決定調整它的大小,新的大小將反映在「長度」中。 – 2012-07-12 12:32:06

+0

我有點不清楚。當我說內聯電話時,我的意思是它直接在呼叫地點訪問「長度」時發生的任何事情。這類似於函數調用的內聯。 – 2012-07-12 20:53:36