断言(3/2==1):这行吗? 我刚刚了解到C++操作符之前没有定义除法操作符的舍入行为。解决方案是使用std::div。()
我的程序总是假设断言(3/2==1):这行吗? 我刚刚了解到C++操作符之前没有定义除法操作符的舍入行为。解决方案是使用std::div。(),c++,optimization,assert,C++,Optimization,Assert,我的程序总是假设/只会截断小数部分。作为一个快速修复,我希望包含一个断言,这样如果有人在具有不同舍入行为的平台上编译,我至少会得到一个错误 assert(3/2==1)或static\u assert(3/2==1)会做这项工作吗?或者这些常数会被编译器内部算法优化,这可能与机器实际操作的不同。 < P>“我刚刚了解到,除法操作符的舍入行为在C++ 11之前没有定义。”如果两个参数都是正整数,则不是这样 3/2==1是一个编译时常量表达式,其值为true,因此代码将编译为assert(true)
/
只会截断小数部分。作为一个快速修复,我希望包含一个断言,这样如果有人在具有不同舍入行为的平台上编译,我至少会得到一个错误
assert(3/2==1)
或static\u assert(3/2==1)
会做这项工作吗?或者这些常数会被编译器内部算法优化,这可能与机器实际操作的不同。 < P>“我刚刚了解到,除法操作符的舍入行为在C++ 11之前没有定义。”如果两个参数都是正整数,则不是这样
3/2==1
是一个编译时常量表达式,其值为true
,因此代码将编译为assert(true)
考虑使用
static\u assert
作为编译时断言。不会为您提供所需的编译器错误。对此,我深表歉意。现在修好了。我真的不在乎是编译器错误还是运行时错误,我只想得到警告,如果它发生。。。(作为一个快速解决方案。)参考文献说:“商是按照实现定义的方向四舍五入的。”我没有看到对负值的限制。()@Michael“在C++11之前,如果二进制运算符%的一个或两个操作数都为负数,则余数的符号由实现定义,因为它取决于整数除法的舍入方向。”在我看来,这可能导致-3/2
被解析为1
,2
,-1
或-2
@Michael,1)在C++03和C++11中:(a/b)*b+a%b
等于a
。2) a%b
如果两个操作数都为正,则为非负。