我刚刚了解到在C ++ 11之前没有定义除法运算符的舍入行为。解决方案是使用std::div
。 (Safely round to next smaller multiple)
我的程序总是假设/
会截断小数部分。作为一个快速修复,我想包含一个断言,以便如果有人在具有不同舍入行为的平台上编译,我至少会得到一个错误。
assert(3 / 2 == 1)
或static_assert(3 / 2 == 1)
会完成这项工作吗?或者这些常数是否会被编译器内部算法优化掉,这可能与机器的实际操作有所不同?
答案 0 :(得分:9)
"我刚刚得知在C ++ 11"之前没有定义除法运算符的舍入行为。如果两个参数都是正整数,则不成立。
3 / 2 == 1
是一个编译时常量表达式,其值为true
,因此代码将编译为assert(true)
。
考虑使用static_assert
进行编译时断言。