2013-08-28 95 views
0

我在C中%操作符有問題。我知道%操作符給出了除法的其餘部分。但是當遇到像1 % 23 % 2這樣的問題時,我感到困惑。 Google搜索後,我找到了不同的解決方案。C語言中%操作符的問題

有人說,作爲1/20.5,我們四捨五入下來到0。所以1 % 2爲0

也有人說,作爲1/20.5,我們反而圓了起來,就像我們會在數學,1因此1 % 2是1.

因此,我現在感到困惑。我的問題是:什麼是1%2?

預先感謝您:) :)

+0

對於M%D,無論何時M Jiminion

+0

@Jim我認爲你想要「0 <= M chux

+0

@chux,對於上述斷言是肯定的,M和D需要大於0. – Jiminion

回答

3

簡而言之,兩者都是錯誤的方法。正如你所說%發現其餘部門。

因此1/2等於0餘1

答案是這樣1.

此外,試驗自己,你也可以使用此程序:

#include <stdio.h> 

main() 
{ 
    int remainder; 

    remainder = 1 % 2; 
    printf("1 %% 2 is %d", remainder); 
    return(0); 
} 

希望這有助於:)

+0

非常感謝,這使事情更清晰 –

1

沒有四捨五入,小數部分被簡單地截取。

所以,二分之一是0和1%2是1

4

%是餘數運算符:

%運算符除以它的第一個操作數後計算剩餘 由其第二個

這是該部門留下的。例如:

5%3是2。
5%4是1
5%2是1.(由於2可以在5適合2次,1將被左)

當做1%2的結果是1,因爲1/2是0,餘數是1.

+0

這沒有意義。編輯你的第二行。 :) – WozzeC

+1

@WozzeC太多的工作時間..謝謝;) – Maroun

+2

爲了迂迴,'%'是C中剩下的**操作符。負操作數存在一個重要區別(模數的數學定義)。 –

2

想想M%D(如果M和D都是正數)的簡單方法是:

While (M >= D){ 
    M = M-D; 
} 
return M; 
0

這裏您需要餘數的數學定義。

給定兩個整數米,d,我們說[Rd如果[R滿足兩個條件劃分的其餘

  • 存在另一個整數k使得m == k * d + r
  • 0 <= r < d

在C中,我們有m % d == rm/d == k,只是按照上面的定義。
正如你所看到的那樣,根本沒有任何拘泥(我的意思是:「截斷」是定義的結果)。

從定義,可以obtainded即3%2 == 1和3/2 == 1
其它實例:

4/3 == 1和5/3 == 1,儘管5.0/3.0 == 1.6666(其中 將舍入爲2.0)。

4%3 == 1個5%3 == 2.

您也可以相信式r = m - k * d,其在C被寫爲:

m % d == m - (m/d) * d

然而在標準C中,整數除法遵循以下規則:round to 0
因此,負數的操作數C提供了不同的結果,即數學的結果。
我們將有:

(-4)/ 3 == -1,(-4)%3 == -1(在C),但在普通的數學:(-4)/ 3 = -2,(-4)%3 = 2.

在普通數學中,其餘總是非負的,並且小於abs(d)
在標準C中,其餘部分總是具有第一個運算符的符號。

備註:此說明(否定的情況下)僅適用於標準C99/C11。你必須小心你的編譯器版本,並做一些測試。