Haz*_*lah 18 c++ cmath visual-studio-2013
我在这里检查了abs和fabspython 之间的区别
据我所知,速度和传递的类型有一些不同,但我的问题与VS上的原生c ++有关
关于VS我尝试了以下内容Visual Studio 2013 (v120):
float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]
Run Code Online (Sandbox Code Playgroud)
所以fabs(-9)它会给我一个编译器错误,但是当我尝试执行以下操作时:
double i = -9;
float f2= fabs(i); // This will work fine
Run Code Online (Sandbox Code Playgroud)
我从第一个代码中理解它不会编译因为fabs(-9)需要一个double,并且编译器无法将-9转换为-9.0,但在第二个代码中编译器将在编译时转换i=-9为i=-9.0所以fabs(i)将正常工作.
有更好的解释吗?
另一件事,为什么编译器不能fabs(-9)像在c#中那样自动接受 并将int值转换为double?
[*]:
Error: more than one instance of overloaded function "fabs" matches the argument list:
function "fabs(double _X)"
function "fabs(float _X)"
function "fabs(long double _X)"
argument types are: (int)
Run Code Online (Sandbox Code Playgroud)
Bau*_*gen 16
在C++中,std::abs对于有符号整数和浮点类型都会重载.std::fabs仅处理浮点类型(前C++ 11).请注意,std::重要的是,由于::abs遗留原因通常可用的C函数只能处理int!
这个问题
float f2= fabs(-9);
Run Code Online (Sandbox Code Playgroud)
是不是不存在来自转化int(的类型-9),以double,但是编译器不知道选择哪个变换(int- > float,double,long double),因为存在std::fabs对每个那些三种.您的解决方法明确告诉编译器使用int- > double转换,因此模糊性消失了.
C++ 11通过添加double fabs( Integral arg );将解决此问题,将返回abs转换为的任何整数类型double.显然,使用libstdc ++和libc ++在C++ 98模式下也可以使用此重载.
一般来说,只要使用std::abs,它就会做正确的事情.(@Shafik Yaghmour指出有趣的陷阱.无符号整数类型在C++中做有趣的事情.)
ala*_*ain 11
在 C++ 11 中,abs()单独使用是非常危险的:
#include <iostream>
#include <cmath>
int main() {
std::cout << abs(-2.5) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序2作为结果输出。(现场观看)
始终使用std::abs():
#include <iostream>
#include <cmath>
int main() {
std::cout << std::abs(-2.5) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序输出2.5.
你可以避免意外的结果,using namespace std;但我会反对它,因为它通常被认为是不好的做法,并且因为你必须搜索using指令才能知道是否abs()意味着int超载或double超载。