2015-11-27 72 views
4

我剛剛纔知道在C++ 11之前沒有定義除法運算符的舍入行爲。解決方法是使用std::div。 (Safely round to next smaller multipleassert(3/2 == 1):這是否工作?

我的程序總是假定/只會截斷小數部分。作爲一個快速解決方案,我想包含一個斷言,這樣如果有人在具有不同舍入行爲的平臺上編譯,至少會出現錯誤。

請問assert(3/2 == 1)static_assert(3/2 == 1)能做這份工作嗎?或者,這些常量是否會被編譯器內部的算法優化掉,這些算法可能與機器實際做的不同?

+5

['assert'](http://en.cppreference.com/w/cpp/error/assert)不會給你編譯器錯誤,因爲你需要['static_assert'](http:// en .cppreference.com/W/CPP /語言/ static_assert)。 –

+0

對不起。現在已經修復了。我真的不在乎編譯器或運行時錯誤,如果發生這種情況,我只是希望得到警告......(作爲快速修復) – Michael

回答

9

「我剛剛纔知道,除法運算符的舍入行爲在C++ 11之前沒有定義」。如果兩個參數都是正整數,則不是這樣。

3/2 == 1是一個編譯時常量表達式,其值爲true,以便代碼將編譯爲assert(true)

考慮使用static_assert進行編譯時斷言。

+0

參考文獻說:「商在實現定義的方向上四捨五入。我沒有看到負值的限制。 (http://en.cppreference.com/w/cpp/language/operator_arithmetic#Multiplicative_operators) – Michael

+0

@Michael *「直到C++ 11,如果一個或兩個操作數對二進制運算符%爲負值,則餘數的符號爲「* –

+0

正如我所看到的,這可能會導致將」-3/2「解析爲」1「,」2「,」-1「或」 - 「,因爲它取決於整數除法的舍入方向。 2' –