в то время как выполнение некоторой домашней работы в моей очень странной книге C++, которую мне сказали прежде выбросить, имело очень специфический сегмент кода. Я знаю, что материал домашней работы всегда добавляет дополнительную "тайну", чтобы попытаться смутить Вас как расположение с отступом 2 строк после отдельного оператора для цикла. Но этот, я смущен на том, потому что это, кажется, служит некоторой реальной цели.
в основном это похоже на это:
int counter=10;
...
if(pow(floor(sqrt(counter+0.0)),2) == counter)
...
Я интересуюсь этой частью особенно:
sqrt(counter+0.0)
Есть ли некоторая цель к +0.0
? Действительно ли это - poormans способ сделать статический бросок к двойному? Это избегает некоторого предупреждения компилятора на некотором компиляторе, который я не использую? Вся программа распечатала ту же самую вещь и скомпилировала без предупреждений на g ++ каждый раз, когда я не учел +0.0
часть. Возможно, я не использую достаточно странный компилятор?
Править:
Кроме того, делает gcc, просто повреждают стандарт и не совершают ошибку для Противоречивой ссылки с тех пор sqrt
может взять 3 различных типов параметров?
[earlz@EarlzBeta-~/projects/homework1] $ cat calc.cpp
#include
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
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
double>::__type
sqrt(_Tp __x)
{ return __builtin_sqrt(__x);
Это способ Пурмана выполнять статическое приведение к двойнику?
Да.
Вы не можете вызвать sqrt
с int
в качестве параметра, потому что sqrt
принимает float
, double
, или длинный двойной
. Вы должны привести int
к одному из этих типов, иначе вызов будет неоднозначным.
причина выражения counter + 0.0 в том, чтобы явно сделать его действительным числом. если мы не добавим 0.0, компилятор выполнит неявное преобразование
Это просто другой способ приведения к двойному значению. Это происходит потому, что sqrt не принимает ints. Поскольку двойка выше, она объединит int в 0.0. Аналогичный способ можно использовать для преобразования из (int,double,float) в строку.
double n = 0;
string m = ""+n;