我需要使用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