基本上是这样的:
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);
答案 0 :(得分:13)
这是穷人对双重做静态演员的方法吗?
是
您无法使用sqrt
作为参数来呼叫int
,因为sqrt
需要float
,double
或long 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;