2010-12-09 15 views
10

हाँ मुझे पता है तुम सी शैली C++ डाले उपयोग नहीं करना चाहिए, लेकिन कुछ मामलों में मैं वास्तव में लगता है कि यह एक बहुत अधिक पठनीय यदि आप करते हैं, उदाहरण के लिए इन दोनों की तुलना:सी शैली कास्टिंग और C++ में पठनीयता

d = ((double)i * 23.54)/(d + (double)j); 

d = (static_cast<double>(i) * 23.54)/(d + static_cast<double>(j)); 

कौन सा अधिक पठनीय है?

अब मेरे मुख्य प्रश्न पर। जाहिर है मैं ऊपरी एक पसंद करते हैं, लेकिन वहाँ यह और भी मेरी राय में पठनीय बनाने के लिए एक ही रास्ता है:

d = (double(i) * 23.54)/(d + double(j)); 

मेरे यहां सवाल यह है कि, यह कम कुशल हो जाएगा? क्या इस मामले में संकलक अधिक युगल बनाएगा, अगर उन्हें अन्य तरीकों से डाला गया हो, या यह पर्याप्त चालाक नहीं है? क्या यह सामान्य सी-शैली के मुकाबले कम या ज्यादा खराब है?

+2

सी ++ में सी ++ का उपयोग करते हैं और सी शैली का उपयोग करने से बचते हैं सी ++ ऑब्जेक्ट्स पर। डुप्लिकेट नहीं बल्कि थोड़ा संबंधित http: // stackoverflow।कॉम/प्रश्न/1635897/सी-ऑब्जेक्ट-एंड-सी-स्टाइल-कास्ट-प्रश्न – DumbCoder

+1

+1 अच्छा सवाल है, मुझे लगता है कि मैंने कभी भी डबल (i) का उपयोग नहीं किया है, और मैं मानता हूं कि यह काफी पठनीय है। –

+3

static_cast <...> खोजना बहुत आसान है। – DanDan

उत्तर

4

कंपाइलर ठीक उसी युगल की "बनावट" बनाएगा। आदिम संख्यात्मक प्रकारों को कास्टिंग और निर्माण के बीच कोई व्यावहारिक अंतर नहीं है।

+1

जबकि मैं इस धागे में प्राप्त अन्य उत्तरों और जानकारी की अत्यधिक सराहना करता हूं, यह एकमात्र उत्तर है जिसने वास्तव में मेरे विशिष्ट प्रश्न का उत्तर दिया है, इसलिए मैं इसे उत्तर के रूप में चिह्नित करूंगा;) – DaedalusAlpha

15

वे सभी अपठनीय हैं। आप लिखना चाहिए:

d = (i * 23.54)/(d + j); 
+0

@R .. +1 इसे खोजना :) –

+1

@ डेडलस अल्फा: असल में, इससे कोई फर्क नहीं पड़ता। सी ++ आपके लिए रूपांतरण करेगा और सबसे उपयुक्त प्रकार का उपयोग करेगा। इस समाधान का एक बड़ा फायदा यह है कि यदि आपने अचानक 'फ्लोट' या 'लम्बी डबल' टाइप करने के लिए 'd' को अपडेट किया है, तो संकलक अभी भी सबसे उचित रूपांतरण करेगा जबकि आपके स्पष्ट रूपांतरणों को मैन्युअल रूप से बदला जाना होगा .. और कुछ शायद भुला दिया जाएगा। –

+0

हाँ मैं अब समझ गया। हालांकि मुझे याद नहीं है (या वास्तव में यह जांचने के लिए बहुत आलसी हो कि यह काम करता है या नहीं) तो मैं केवल सुरक्षित पक्ष पर रहने के लिए कहूंगा। बल्कि माफी से सुरक्षित है क्योंकि मुझे डी के प्रकार को बदलने की अत्यधिक संभावना नहीं है, लेकिन जहां रूपांतरण होता है और इसकी आवश्यकता नहीं होती है (जैसा कि मैंने चुना उदाहरण के द्वारा प्रदर्शित किया गया है); – DaedalusAlpha

0

मैं सुझाव है कि आप विधानसभा के लिए संकलन (अपने संकलक इस तरह के एक विकल्प का समर्थन करता है)। उदाहरण के लिए, जीएनयू सी ++ विकल्प-एस असेंबली आउटपुट करेगा ताकि आप अपने लिए देख सकें।

1

आईएमएचओ, static_cast एक अधिक पठनीय है, क्योंकि यह कलाकार की प्रकृति के बारे में पाठक जानकारी प्रदान करता है।

2

मैंने इस विशेष मामले में कंपाइलर को कास्ट चुनने के बारे में पहले ही आर के जवाब पर टिप्पणी की है।

वहाँ हालांकि जिन मामलों में आप एक स्पष्ट रूपांतरण चाहते है कर रहे हैं:

  • आप अतिप्रवाह
  • रोकने के लिए या परिशुद्धता वृद्धि करना चाहते हैं आप रूपांतरण की वैधता की जांच करना चाहते हैं

Boost Numeric Conversion यहां एक अत्यधिक उपयुक्त कलाकार प्रदान करता है, static_cast से बहुत बेहतर: boost::numeric_cast

  • कोई भूमि के ऊपर जब कोई चेक आवश्यक है मूल्य की
  • क्रम की जांच (यानी एक बड़ी पूर्णांक के लिए एक छोटे से कास्टिंग) जरूरत पड़ने पर (यानी छोटा सा करने के लिए बड़े से कास्टिंग या अहस्ताक्षरित पर हस्ताक्षर किए)

यह, के बाद से संख्या के स्वभाव पर प्रकाश डाला गया है, और अधिक सुरक्षित है, क्योंकि यह अपरिभाषित व्यवहार (और पोर्टेबिलिटी मुद्दों) में किक करने से बचाता है static_cast की तुलना में अधिक पठनीय है।

+0

@j_random_hacker: उदाहरण के लिए धन्यवाद :) –

+0

आपका संस्करण, भले ही आप बग को ठीक करते हैं, फिर भी पूर्वाग्रह है। 'एन' के मूल्य के आधार पर संभावित रूप से बहुत खराब पूर्वाग्रह। –

+0

@Matthieu: उस उदाहरण को पोस्ट करने वाले दूसरे स्थान पर मेरी टिप्पणी पढ़ें। यह गलत है। –

2

कारण है कि सी में डाली कार्यों ++ लंबे होते हैं एक बोझल है डिजाइन द्वारा 1) ord में उपयोगकर्ता को यह दिखाने के लिए कि वह शायद कुछ गलत कर रहा है 2) मामलों में जब आवश्यक हो, तो कोड के उस टुकड़े पर ध्यान आकर्षित करें, कि यह कुछ खतरनाक या अपरंपरागत हो सकता है।

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