C++中的abs
函数。在C++中使用abs
函数要注意存在两种版本,一种是在stdlib.h
中定义的版本,另一个是在cmath
头文件中定义的。事实上在stdlib.h
文件是C的函数,而cmath
中的是C++版本。
根据ISO C/C++的标准规定,C语言的abs
函数仅仅支持整数的绝对值计算,必须使用fabs
才能获得浮点数的绝对值;C++的abs
则可以自然支持对整数和浮点数两个版本(实际上还能够支持复数)。
如果在C++程序中,由于头文件关系,不慎使用了C版本的abs
函数,并且输入的是一个有小数的浮点数,那么其行为就可能不符合程序员的预期了,因为在传入函数参数时,浮点数会用截断的方式转换为整数。
例如:
/* source file main.cpp */
#include <iostream>
#include <stdlib.h> // c function abs
int main(int argc, char* argv[])
{
using namespace std;
cout << "abs(0.123) = " << abs(0.123) << endl;
return 0;
}
/* output */
abs(0.123) = 0
C++中建议使用cmath
头文件,事实上不止abs
函数,还有一系列函数都被特殊处理了。具体可以阅读不同编译器的cmath
、math.h
和stdlib.h
文件源代码。
微软的C++编译器在默认的情况下,使用宏对C版本
abs
函数做了保护处理,通常情况下程序员不容易发现这个问题。
网友评论