выполняя домашнюю работу по моей очень странной книге C++, которую мне раньше говорили выбросить имел очень своеобразный сегмент кода. Я знаю, что домашние задания всегда добавляют дополнительную «загадку», чтобы попытаться запутать вас, например, отступ на 2 строки после цикла for с одним оператором. Но этот я запутался, потому что он, кажется, служит какой-то реальной цели.
в основном это так:
int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...
Меня особенно интересует эта часть:
sqrt(counter+0.0)
Есть ли какая-то цель в +0.0
? Это способ бедняков сделать статическое приведение к двойнику? Избегает ли это предупреждения компилятора о каком-то компиляторе, который я не использую? Вся программа печатала одно и то же и компилировалась без предупреждений на g++ всякий раз, когда я пропускал часть +0.0
. Может быть, я использую недостаточно странный компилятор?
Редактировать:
Кроме того, 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);