我需要使用CMATH的ABS()函数,但Visual Studio中说,它的过载,我甚至不能使用这样的事情:问题CMATH重载函数C++
unsigned a = 5, b = 10, c;
c = abs(a-b);
我不知道该怎么正确使用它。
我需要使用CMATH的ABS()函数,但Visual Studio中说,它的过载,我甚至不能使用这样的事情:问题CMATH重载函数C++
unsigned a = 5, b = 10, c;
c = abs(a-b);
我不知道该怎么正确使用它。
versions in <cmath>
用于浮点类型,所以没有明确的最佳匹配。积分类型的过载在<cstdlib>
,所以其中之一将产生良好的匹配。如果您在不同类型上使用abs
,则可以同时使用includes和let overload resolution来完成其工作。
#include <cmath>
#include <cstdlib>
#include <iostream>
int main()
{
unsigned int a = 5, b = 10, c;
c = std::abs(a-b);
std::cout << c << "\n"; // Ooops! Probably not what we expected.
}
在另一方面,这并不产生正确的代码,因为表达式a-b
不调用integer promotion,所以结果是unsigned int
。真正的解决方案是使用有符号整数类型的差异,以及整数类型的重载。
正如你所看到的here,没有cmath函数abs
需要一个无符号整数。这是因为无符号整数从不是负数。请尝试执行以下操作:
int a = 5, b = 10;
int c = abs(a-b);
在这种情况下,c = 5
与预期的一样。
您可以使用三元运算:
c = (a > b) ? a - b : b - a;
另请参见[?是的std :: ABS(0U)形成不良(http://stackoverflow.com/q/29750946/1708801) – 2015-06-03 15:25:47