我不是在問有關定義,而是爲什麼語言創建者選擇在C++中定義具有不對稱行爲的模數。 (我也認爲Java)爲什麼模數在編程語言中定義的方式
假設我想找到大於或等於n的最小數,這個數可以被f整除。
如果n爲正數,那麼我這樣做:
if(n % f)
ans = n + f - n % f;
如果n爲負數:
ans = n - n % f;
顯然,與正數和負數打交道時,這個定義是不是最有利的。那麼爲什麼它是這樣定義的?它在什麼情況下產生權宜之計?
我不是在問有關定義,而是爲什麼語言創建者選擇在C++中定義具有不對稱行爲的模數。 (我也認爲Java)爲什麼模數在編程語言中定義的方式
假設我想找到大於或等於n的最小數,這個數可以被f整除。
如果n爲正數,那麼我這樣做:
if(n % f)
ans = n + f - n % f;
如果n爲負數:
ans = n - n % f;
顯然,與正數和負數打交道時,這個定義是不是最有利的。那麼爲什麼它是這樣定義的?它在什麼情況下產生權宜之計?
你錯了。當n
爲負值時,只要%
和/
的結果一致,C++允許模運算符的結果爲負值或正值,因此對於任何給定的a
和b
,表達式(a/b)*b + a%b
總是會產生a
。 C99要求a % b
的結果與a
的符號相同。某些其他語言(例如Python)要求a % b
的符號與b
的符號相同。
這意味着您給出的負面表達式n
實際上並不需要在C++中工作。當/如果n%f
產生一個正數(儘管n
是負數),它會給出ans
,它小於n
。
'(a/b)* b + a%b'總是產生'a',除非'b'爲零,那麼行爲是不確定的。 – JohnPS
*「當n爲負值時,... *」更好地說,如果除數或除數爲負,則結果是在C++ 03中定義的實現。但是,大多數C++編譯器遵循C99約定;這可以讓供應商使用C和C++代碼的相同機制。 C++ 11遵循C99約定。它不再是實現定義的。 –
@David:我認爲指出* *操作數被否定爲實現定義的結果 - 但由於他特別提到了'n'是否定的,因此決定最好只討論這一點。就相似性而言,C99比領導者更多是追隨者 - 也就是說,他們對它進行了標準化,因爲基本上所有現代硬件都以這種方式工作。舉一個例子,微軟似乎使用x86'div'指令產生的東西,並且對C99一致性沒有表現出明顯的興趣。 –
你在問爲什麼模數對於負操作數沒有固定的定義? –
http://en.wikipedia.org/wiki/Modulo_operation – starblue
澄清:我在問爲什麼定義關於第一個操作數的奇偶性是不對稱的。 –