首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmath重载函数的问题C++

cmath重载函数的问题C++
EN

Stack Overflow用户
提问于 2013-03-05 15:17:05
回答 3查看 533关注 0票数 2

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

代码语言:javascript
复制
unsigned a = 5, b = 10, c;
c = abs(a-b);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 15:19:56

versions in 用于浮点类型,因此没有明确的最佳匹配。整型类型的重载是在中,因此其中之一将产生一个很好的匹配。如果您在不同的类型上使用abs,则可以同时使用includes和让重载解析来完成其工作。

代码语言:javascript
复制
#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。真正的解决方案是使用带符号的整数类型来表示差异,以及整数类型的std::abs重载。

票数 5
EN

Stack Overflow用户

发布于 2013-03-05 15:25:08

正如您可以看到的那样,没有here函数abs可以接受无符号整数。这是因为无符号整数永远不是负数。请尝试执行以下操作:

代码语言:javascript
复制
int a = 5, b = 10;
int c = abs(a-b);

在本例中,c = 5与预期一致。

票数 2
EN

Stack Overflow用户

发布于 2013-03-05 16:07:13

您可以使用三元运算符:

代码语言:javascript
复制
c = (a > b) ? a - b : b - a;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15217936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档