2011-12-23 30 views
6

我注意到對C++ 11的5.6節的一些措辭更改。 (我在看2011年2月28日的C++標準草案N3242。)新的(草案)標準包含以下句子:C++中的整數部分11

「對於整型操作數,運算符產生的代數商與任何小數部分丟棄;」

該聲明不在03標準(ISO-IEC-14882-2003)的5.6中,但我不認爲這是一個變化,是嗎?這是C和C++多年來的工作方式,除非我已經失去了主意(無論如何可能發生了這種情況)。

回答

9

你不會生氣。

甲腳註5.6/4說:

[C++03 footnote 74]:根據朝向修訂ISO C的 工作正在進行中,整數除法的優選算法遵循在ISO Fortran標準,ISO/IEC 1539定義的 規則:1991年,其中 的商總是趨於零。

在C++ 11中,此行爲是明確要求的,而不是「首選」;的變化列在兼容性部分:

[C++11: C.2.2]:
變化:指定舍入爲整數/%
理由的結果:增加的便攜性,C99的兼容性。
對原始特徵:有效C++使用整數除法 回合的結果朝向0或向負無窮大2003代碼,而這 國際標準總是舍入0朝向

1

幾乎結果。在C++ 03中,%(這兩個術語都是指定的)的餘數的符號沒有指定,因爲在某些情況下,這樣的舍入也可能從零開始。與C++ 03腳註比較:

根據工作朝向ISO C的修訂進行,優選的 算法整數除法遵循在ISO Fortran標準,ISO/IEC 1539定義的規則:1991 ,其中商總是 四捨五入到零。

實際上,這幾乎從來沒有任何區別。

+0

這將使我的代碼有很大的不同。這是否意味着'%'結果的符號現在也被定義了? – ThomasMcLeod 2011-12-23 15:00:58

+1

@ThomasMcLeod:是的,整個'/'/'%'事物現在被定義爲在任何地方表現相同。你確定它在你的代碼中有所作爲嗎?你的實現是少數尚未截斷的實現之一嗎? – PlasmaHH 2011-12-23 15:08:22

+1

至少有兩種解釋模數算子的方法。更常見的方式就是分工的其餘部分。在這種情況下,結果的符號與商的符號相同。例如'-5%-4 == 1 && -5%4 == -1'。另一種方法是代數方式,mod運算符返回操作數的同餘類。在這種情況下,當且僅當'm'除('b-a)'時,'a%m == b''被定義爲'm'爲正。這裏。 'b'是一個嚴格小於'm'的非負數,所以'-5%4 == 3'。 – ThomasMcLeod 2011-12-25 17:28:22