2010-04-12 11 views
7

मेरी बहुत अजीब सी ++ पुस्तक, which I've been told before to throw away में कुछ होमवर्क करते समय, एक बहुत ही असामान्य कोड सेगमेंट था। मुझे पता है कि गृहकार्य सामग्री हमेशा "रहस्य" में फेंकती है ताकि आपको एक-कथन के लिए लूप के बाद 2 लाइनों को इंडेंट करने की कोशिश की जा सके। लेकिन यह मैं उलझन में हूं क्योंकि ऐसा लगता है कि यह कुछ वास्तविक उद्देश्य प्रदान करता है।वर्ग (int_value + 0.0) - क्या इसका कोई उद्देश्य है?

मूल रूप से यह इस तरह है:

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

मैं इस हिस्से विशेष रूप से में दिलचस्पी रखता हूँ:

sqrt(counter+0.0) 

वहाँ +0.0 करने के लिए कुछ उद्देश्य है? क्या यह गरीबों को एक स्थिर कलाकार का दोगुना करने का तरीका है? क्या यह कुछ कंपाइलर पर कुछ कंपाइलर चेतावनी से बचता है जिसका मैं उपयोग नहीं करता? जब भी मैंने +0.0 भाग छोड़ा, तो पूरे कार्यक्रम ने एक ही चीज़ को मुद्रित किया और g ++ पर चेतावनियों के बिना संकलित किया। शायद मैं एक अजीब पर्याप्त संकलक का उपयोग नहीं कर रहा हूँ?

संपादित करें:

इसके अलावा, जीसीसी सिर्फ मानक तोड़ने करता है और sqrt के बाद से अस्पष्ट संदर्भ मानकों के 3 विभिन्न प्रकार ले जा सकते हैं के लिए एक त्रुटि नहीं है?

[[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] $ 

इसके अलावा, यहां अपने सिस्टम पुस्तकालयों 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); 
+7

वास्तविक सवाल यह है कि आपने अभी तक पुस्तक को क्यों नहीं फेंक दिया है? :) –

+0

@ जस्टिन एक डिग्री के लिए आवश्यक है या मैं निश्चित रूप से हर पृष्ठ जला देगा। – Earlz

उत्तर

13

इस poormans है नहीं कर रहा हूँ एक स्थिर कास्ट एक डबल करने का तरीका?

हां।

आप अपने पैरामीटर के रूप में एक int साथ sqrt कॉल नहीं कर सकते, क्योंकि sqrt एक float, double, या long double लेता है। आपको int उन प्रकारों में से किसी एक को डालना होगा, अन्यथा कॉल संदिग्ध है।

+1

लेकिन क्यों? यह इस मामले में भी जरूरी नहीं है। – Earlz

+5

@Earlz: मुझे नहीं पता कि कोई भी '+ 0.0' का उपयोग करने की सिफारिश क्यों करेगा। इसके लिए एकमात्र चीज यह है कि यह 'static_cast ' या '(डबल) 'से टाइप करने के लिए कम है, लेकिन इसका उपयोग करने का कोई अच्छा कारण नहीं है। –

+0

@ जेम्स क्यों g ++ इस बारे में कोई त्रुटि या चेतावनी नहीं देते हैं? मेरा संपादन देखें। – Earlz

0

अभिव्यक्ति काउंटर + 0.0 का कारण स्पष्ट रूप से इसे वास्तविक संख्या बनाना है। यदि हम 0.0 जोड़ते हैं तो कंपाइलर अंतर्निहित रूपांतरण करेगा

0

यह दो बार डालने का एक और तरीका है। ऐसा इसलिए है क्योंकि sqrt ints स्वीकार नहीं करता है। क्योंकि एक डबल अधिक है, यह int को 0.0 में विलय कर देगा। स्ट्रिंग करने के लिए (int, double, float) से कनवर्ट करने के लिए भी वही तरीका किया जा सकता है।

डबल एन = 0;

स्ट्रिंग एम = "" + एन;

+2

मुझे लगता है कि आप किसी अन्य प्रोग्रामिंग भाषा के बारे में सोच रहे हैं; आप इसे C++ में नहीं कर सकते हैं। –

संबंधित मुद्दे