2010-04-12 4 views
7

während der Hausaufgaben in meinem sehr seltsamen C++ Buch, which I've been told before to throw away, hatte ein sehr seltsames Codesegment. Ich weiß, dass Hausaufgaben-Zeug immer ein zusätzliches "Mysterium" hineinwirft, um zu versuchen, Sie zu verwirren, als würden Sie 2 Zeilen nach einer Single-Statement-For-Schleife einrücken. Aber dieses hier bin ich verwirrt, weil es einem wirklichen Zweck zu dienen scheint.sqrt (int_value + 0.0) - Hat es einen Zweck?

im Grunde ist es wie folgt aus:

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

Ich habe Interesse an diesem Teil vor allem:

sqrt(counter+0.0) 

Gibt es einen Zweck zum +0.0? Ist dies die poormanische Art, eine statische Besetzung zu einem Double zu machen? Vermeidet dies eine Compiler-Warnung bei einem Compiler, den ich nicht verwende? Das gesamte Programm druckte genau das Gleiche und kompilierte ohne Warnungen auf g ++, wann immer ich den +0.0 Teil ausließ. Vielleicht verwende ich nicht einen komischen Compiler?

Edit:

Auch dann, wenn gcc nur Standard brechen und nicht einen Fehler für mehrdeutige Referenz seit sqrt machen kann 3 verschiedene Arten von Parametern nehmen?

[[email protected]~/projects/homework1] $ cat calc.cpp 
#include <cmath> 

int main(){ 
    int counter=0; 
    sqrt(counter); 
} 
[[email protected]~/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() 
[[email protected]~/projects/homework1] $ 

Auch hier ist der relevante Teil meiner Systembibliotheken cmath ich auf Vorlagen nicht so scharf bin, so bin ich nicht sicher, was es

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

Die eigentliche Frage ist, warum hast du das Buch noch nicht weggeworfen? :) –

+0

@Justin für einen Abschluss erforderlich oder ich würde definitiv jede Seite brennen. – Earlz

Antwort

13

ist dies die Poormans tut Art und Weise, eine statische Besetzung zu einem Doppel zu machen?

Ja.

Sie nicht sqrt mit einem int als Parameter nennen kann, weil sqrt eine float nimmt, double oder long double. Sie müssen die int auf einen dieser Typen umwandeln, andernfalls ist der Aufruf mehrdeutig.

+1

aber warum? es ist in diesem Fall nicht einmal notwendig. – Earlz

+5

@Earlz: Ich weiß nicht, warum jemand "+ 0.0" empfehlen würde. Das einzige, was es dafür hat, ist, dass es weniger zu tippen ist als 'static_cast ' oder '(double)', aber das ist kein guter Grund, es zu benutzen. –

+0

@James Warum gibt g ++ dann keinen Fehler oder eine Warnung? Siehe meine Bearbeitung. – Earlz

0

Der Grund für den Ausdruck counter + 0.0 ist, es explizit zu einer reellen Zahl zu machen. Wenn wir 0.0 nicht addieren, führt der Compiler eine implizite Konvertierung durch

0

Es ist nur eine andere Möglichkeit, zu einem Double zu konvertieren. Dies liegt daran, dass sqrt keine Ints akzeptiert. Da ein Double höher ist, wird es den Int in die 0.0 verschmelzen. Derselbe Weg kann für die Konvertierung von (int, double, float) in string verwendet werden.

doppelt n = 0;

Zeichenfolge m = "" + n;

+2

Ich denke, Sie denken an eine andere Programmiersprache; Sie können das nicht in C++ tun. –

Verwandte Themen