2

cmath の abs() 関数を使用する必要がありますが、Visual Studio はそれがオーバーロードされていると言っており、次のようなものを使用することさえできません。

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

正しい使い方がわかりません。

4

3 に答える 3

5

バージョンは<cmath>浮動小数点型用であるため、明確に最適な一致はありません。整数型のオーバーロードは に<cstdlib>あるため、そのうちの 1 つが適切に一致します。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 intstd::abs

于 2013-03-05T07:19:55.623 に答える
2

ここでわかるようabsに、符号なし整数を取るcmath 関数はありません。これは、符号なし整数が負にならないためです。代わりに次のことを試してください。

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 に答える