sqrt(int_value + 0.0) - 它有用吗?

Ear*_*rlz 7 c++ casting

在我非常奇怪的C++书中做一些功课,我之前被告知要扔掉,有一个非常奇特的代码段.我知道家庭作业的东西总会引发额外的"神秘感",试图让你感到困惑,就像在单循语for循环后缩进2行一样.但是这个我很困惑,因为它似乎服务于一些真实的目的.

基本上是这样的:

int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...
Run Code Online (Sandbox Code Playgroud)

我特别感兴趣的是这部分:

sqrt(counter+0.0)
Run Code Online (Sandbox Code Playgroud)

+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] $
Run Code Online (Sandbox Code Playgroud)

另外,这里是我的系统库的相关部分我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);
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 13

这是穷人做静态演员的方式吗?

是.

你不能叫sqrtint作为它的参数,因为sqrt需要float,doublelong double.你必须将其转换int为其中一种类型,否则调用是不明确的.

  • @Earlz:我不知道为什么有人会推荐使用`+ 0.0`.唯一能做的就是输入的次数少于`static_cast <double>`或`(double)`,但这并不是使用它的好理由. (5认同)