2

我需要使用 cmath 的 abs() 函数,但 Visual Studio 说它超载了,我什至不能使用这样的东西:

unsigned a = 5, b = 10, c;
c = abs(a-b);

我不知道如何正确使用它。

4

3 回答 3

5

中的版本适用<cmath>于浮点类型,因此没有明确的最佳匹配。整数类型的重载是 in <cstdlib>,因此其中之一将产生良好的匹配。如果你abs在不同的类型上使用,你可以同时使用包含并让重载解析来完成它的工作。

#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不调用整数提升,所以结果是一个unsigned int. 真正的解决方案是使用有符号整数类型来处理差异,以及整数类型std::abs重载。

于 2013-03-05T07:19:55.623 回答
2

正如您在此处看到的,没有 cmath 函数abs采用无符号整数。这是因为无符号整数永远不会是负数。请尝试执行以下操作:

int a = 5, b = 10;
int c = abs(a-b);

在这种情况下,c = 5正如预期的那样。

于 2013-03-05T07:25:08.223 回答
0

您可以使用三元运算符:

c = (a > b) ? a - b : b - a;
于 2013-03-05T08:07:12.577 回答