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

时间:2010-04-12 04:00:07

标签: c++ casting

在我非常奇怪的C ++书籍which I've been told before to throw away中做一些功课时,有一个非常特殊的代码段。我知道家庭作业的东西总会引发额外的“神秘感”,试图让你感到困惑,就像在单循语for循环后缩进2行一样。但是这个我很困惑,因为它似乎有一些真实目的。

基本上是这样的:

int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...

我对这部分特别感兴趣:

sqrt(counter+0.0)

+0.0有什么用途吗?这是穷人做静态演员的方式吗?这是否避免了某些编译器上的编译器警告我不使用?整个程序打印完全相同的东西,并在我遗漏+0.0部分时在g ++上编译而没有警告。也许我没有使用一个奇怪的编译器?

编辑:

此外,由于sqrt可以采用3种不同类型的参数,gcc是否会破坏标准而不会出现不明确的参考错误?

[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);

3 个答案:

答案 0 :(得分:13)

  

这是穷人对双重做静态演员的方法吗?

您无法使用sqrt作为参数来呼叫int,因为sqrt需要floatdoublelong double 。您必须将int强制转换为其中一种类型,否则调用将不明确。

答案 1 :(得分:0)

表达式计数器+ 0.0的原因是明确地使它成为实数。如果我们不添加0.0,编译器将执行隐式转换

答案 2 :(得分:0)

这只是另一种投射到双倍的方式。这是因为sqrt不接受整数。因为double更高,所以它会将int合并到0.0中。从(int,double,float)转换为string可以采用相同的方法。

double n = 0;

string m =“”+ n;