在我非常奇怪的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
这是穷人做静态演员的方式吗?
是.
你不能叫sqrt
有int
作为它的参数,因为sqrt
需要float
,double
或long double
.你必须将其转换int
为其中一种类型,否则调用是不明确的.