Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
断言(3/2==1):这行吗? 我刚刚了解到C++操作符之前没有定义除法操作符的舍入行为。解决方案是使用std::div。()_C++_Optimization_Assert - Fatal编程技术网

断言(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
如果两个操作数都为正,则为非负。