我在一本非常奇怪的C++书中做作业,之前有人告诉我应该扔掉这本书,其中有一个非常奇特的代码片段。我知道作业总是会增加一些“神秘”的内容来试图让你困惑,比如在单语句for循环后缩进2行。但这个让我困惑的是因为它似乎有一些真正的用途。
基本上它是这样的:
int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...
我尤其关注这一部分:
sqrt(counter+0.0)
这里的
+0.0
有什么作用?这是一种将数据强制转换为双精度浮点数的方式吗?这样做是为了避免某些我不使用的编译器发出警告吗?当我省略 +0.0
部分时,整个程序都打印了完全相同的东西,并在 g++ 上编译而没有警告。也许我没有使用够奇怪的编译器?编辑:
此外,gcc 是否会违反标准并不对模棱两可的引用发出错误,因为
sqrt
可以接受 3 种不同类型的参数?[earlz@EarlzBeta-~/projects/homework1] $ cat calc.cpp
#include <cmath>
int main(){
int counter=0;
sqrt(counter);
}
[earlz@EarlzBeta-~/projects/homework1] $ g++ calc.cpp
/usr/lib/libstdc++.so.47.0: warning: strcpy() is almost always misused, please use strlcpy()
/usr/lib/libstdc++.so.47.0: warning: strcat() is almost always misused, please use strlcat()
[earlz@EarlzBeta-~/projects/homework1] $
此外,这是我的系统库
cmath
的相关部分。我对模板不太熟悉,所以不确定它在做什么。 using ::sqrt;
inline float
sqrt(float __x)
{ return __builtin_sqrtf(__x); }
inline long double
sqrt(long double __x)
{ return __builtin_sqrtl(__x); }
template<typename _Tp>
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
double>::__type
sqrt(_Tp __x)
{ return __builtin_sqrt(__x);