6

डबल के रूप में द्विपक्षीय स्थिति को स्कॉप प्रतिबंध के रूप में उपयोग करने का सुझाव देता है। विशेष रूप से इस उदाहरण।सत्य/झूठी

if (double d = fd() ) { 
    // d in scope here... 
} 

मैं कलाकृतियां हूँ कि कैसे एक सही/गलत अर्थों में घोषणा की व्याख्या करने के।

  1. यह एक घोषणा
  2. यह एक डबल है।

संपादित करें: यह 6.3.2.1 में है + सी ++ प्रोग्रामिंग भाषा एक सिफारिश के रूप में।

संपादित 2: टेम्पलेट्स के templatetypedefs सुझाव, विशेष रूप से गतिशील जानवरों के साथ, Bjarnes सुझाव के लिए अंतर्दृष्टि दे सकता है।

स्टीवजेसॉप मुझे बताता है: - एक शर्त अभिव्यक्ति नहीं है यह एक घोषणा भी हो सकती है, मूल्य का उपयोग किया जाता है, मूल्य का मूल्यांकन किया जाता है।

+1

करने के लिए [इस सवाल] जवाब (http://stackoverflow.com/q/9833790/636019) के रूप में अच्छी तरह से आपके प्रश्न का उत्तर होगा। – ildjarn

+1

मैंने केवल उस अनुभाग को पढ़ा है जिसके बारे में आप बात कर रहे हैं और इस भावना से दूर आ गए कि चर्चा इसे स्कोप प्रतिबंध (और कॉम्पैक्ट कोड के अतिरिक्त लाभ प्राप्त करने) के रूप में उपयोग करने के बारे में अधिक थी और इसमें बहुत कुछ नहीं था विशिष्ट डेटाटाइप। मुझे लगता है कि वह 'int' के साथ 'डबल' को बदल सकता था और अभी भी अपना इच्छित संदेश प्राप्त कर लिया था। हालांकि मैं इसे कैसे पढ़ता हूं। – jedwards

+0

@jedwards हां, लेकिन डबल का उपयोग एक जवाब मांगना है। एक इंट घोषणा अभी भी एक जवाब के योग्य एक विसंगति है। –

उत्तर

6

जो कोड आप देख रहे हैं वह if कथनों में चर घोषित करने के लिए एक विशेष तकनीक है।

if (T* ptr = function()) { 
    /* ptr is non-NULL, do something with it here */ 
} else { 
    /* ptr is NULL, and moreover is out of scope and can't be used here. */ 
} 

एक विशेष रूप से सामान्य मामले dynamic_cast यहाँ का प्रयोग होता है:

if (Derived* dPtr = dynamic_cast<Derived*>(basePtr)) { 
    /* basePtr really points at a Derived, so use dPtr as a pointer to it. */ 
} else { 
    /* basePtr doesn't point at a Derived, but we can't use dPtr here anyway. */ 
} 

क्या आपके मामले में हो रहा है कि आप एक doubleif बयान के अंदर घोषणा कर रहे है आप आमतौर पर कुछ इस तरह देखते हैं। सी ++ स्वचालित रूप से किसी भी nonzero मान को true और false के रूप में शून्य मान के रूप में व्याख्या करता है। इस कोड का अर्थ क्या है "d घोषित करें और इसे fd() के बराबर सेट करें। यदि यह nonzero है, तो if कथन निष्पादित करें।"

यह कहा गया, यह एक बहुत बुरा विचार है क्योंकि double एस गोल करने वाली त्रुटियों के सभी प्रकार के अधीन हैं जो उन्हें ज्यादातर मामलों में 0 होने से रोकते हैं। यह कोड लगभग if कथन के शरीर को लगभग निश्चित रूप से निष्पादित करेगा जब तक function बहुत अच्छी तरह से व्यवहार नहीं किया जाता है।

आशा है कि इससे मदद मिलती है!

+0

@CaptainGiraffe आप इसे उत्तर के रूप में चिह्नित कर सकते हैं ... – bames53

+0

@ bames53 यह लगभग है जैसे आप मेरे दिमाग को पढ़ते हैं। मैं अभी भी बूल बी = डबल डी = एफडी() की असंगतता पर एक टिप्पणी पसंद करूंगा; हालांकि, लेकिन यह एक और सवाल हो सकता है। –

+1

"और इसके अलावा गुंजाइश से बाहर है और इसका उपयोग यहां नहीं किया जा सकता है" - यह * अन्यथा खंड में * दायरे में है, लेकिन निश्चित रूप से पॉइंटर्स और स्मार्ट पॉइंटर्स के साथ आप एक चर के साथ ऐसा नहीं कर सकते हैं जो परीक्षण झूठा, इसलिए आप इसे सामान्य रूप से वहां उपयोग नहीं करते हैं। मुझे लगता है कि एक और मूल्य असाइन कर सकता है। यदि आपने इसे उपयोगकर्ता द्वारा परिभाषित प्रकार के साथ उपयोग किया है जिसमें "विफलता" को इंगित करने के लिए एक सुरक्षित बूल मुहावरे है, तो शायद 'अन्य' खंड में आप ऑब्जेक्ट * क्यों * यह "विफल" पूछताछ करेंगे। –

2

if कथन असाइनमेंट अभिव्यक्ति में चर को आवंटित मान पर भविष्यवाणी करता है। यदि डबल कुछ भी लेकिन 0.0 के लिए मूल्यांकन करता है तो यह कोड को अंदर चलाएगा।

ध्यान दें कि आपको शून्य के साथ युगल की तुलना नहीं करना चाहिए, लेकिन यह आमतौर पर मेरे अनुभव में काम करता है।

असल में, आपको यह नहीं करना चाहिए।

इस विषय के अन्य योगदानकर्ताओं ने पाया है कि इस अभिव्यक्ति का उपयोग शून्य मामले को बाहर करने के लिए किया जाता है ताकि विभाजित-शून्य-शून्य से बच सके। यह निश्चित रूप से स्मार्ट है और ऐसी स्थिति जहां तक ​​मेरा संबंध है, इस उपयोग को वैध बनाता है (लेकिन इस तरह के कोड के भ्रम पर विचार करें)।

+0

बजेर्ने मुझे बताता है कि यह एक मुहावरे है। बस केह रहा हू। 6.3.2.1 सी ++ प्रोग्रामिंग भाषा। –

+2

वह इस तथ्य का जिक्र कर रहा है कि '''' ब्लॉक के अंदर (और केवल अंदर) दायरे में डबल' डी' है। जो जरूरी नहीं है। मेरा मुद्दा यह है कि डबल टू बूल डालने का कोई अच्छा कारण नहीं होता है। क्यों 'int' प्रकार का एक चर का उपयोग नहीं किया जाता है, मुझे नहीं पता है। (यह एक बहुत ही आम मुहावरे है) –

+2

क्यों पृथ्वी पर आपको शून्य के साथ युगल की तुलना नहीं करना चाहिए? यह पूरी तरह से ठीक काम करता है और अच्छी तरह से परिभाषित व्यवहार है। फ़्लोटिंग प्वाइंट गणित आश्चर्यजनक हो सकता है, लेकिन यह वूडू नहीं है और इस तरह की सलाह से अच्छी तरह से सेवा नहीं की जाती है। –

2

यह एक घोषणा और एक डबल दोनों है। यह हालांकि, इस पैटर्न, सरल करने के लिए छोटे से अतिरिक्त वाक्य रचना के लायक है के रूप में यह काफी उपयोगी और आम है

{ 
    double d = fd(); 
    if (d) { 
    } 
} 

के लिए काफी बराबर है।इसके अलावा, जब आप अन्य खंड जोड़ना शुरू करते हैं तो परिवर्तन कम स्पष्ट होता है, क्योंकि d उनके लिए दायरा से बाहर है।

इसके अलावा, के रूप में दूसरों का उल्लेख किया है, यह सामान्य रूप में उपयोगी है, लेकिन विशिष्ट में एफपी प्रकार कुछ मुद्दों है जब 0.

+0

यह पहला जवाब है जिसके साथ मैं खुश हूं। यह वाक्यविन्यास पूरी जगह पर है। – jedwards

+0

मेरा प्रश्न भी adresses bool b = double d = 0.0 करता है; –

+1

क्या आप सुनिश्चित हैं कि 'd'' else' शाखाओं के दायरे से बाहर है? – jedwards

5

उदाहरण Stroustrup देता है के खिलाफ तुलना में, if ब्लॉक में कोड बिताते हैं d द्वारा एक मूल्य:

if (double d = prim(true)) { 
    left /= d; 
    break; 
} 

डिवीजन 0 से अपरिभाषित व्यवहार है, तो यह इस मामले विभाजित पहले मूल्य 0.0 के खिलाफ d का परीक्षण करने में कुछ अर्थों बनाता है। Stroustrup राज्यों के कारणों के लिए, इस शर्त में परिभाषा को रखना एक सुविधाजनक तरीका है।

आपका कोड कोई कारण नहीं है कि मूल्य 0.0 विशेष होगा, और इसलिए यह स्पष्ट नहीं है कि कोई भी उस परीक्षण के साथ d की परिभाषा को क्यों जोड़ देगा। केवल स्ट्रॉस्ट्रप के पैटर्न का उपयोग करें जब आप जिस प्रकार के परिभाषित कर रहे हैं उसके "झूठे" मानों का विशेष रूप से इलाज किया जाना चाहिए। अन्यथा सिर्फ इस कार्य करें:

{ 
    double d = fd(); 
    // d in scope here... 
} 
+0

मैंने सिर्फ अनुभाग पढ़ा और कनेक्शन नहीं बनाया - मैंने सोचा कि यह एक संक्षिप्त उदाहरण था - - अच्छी पकड़। 'ब्रेक' पर कोई अंतर्दृष्टि; – jedwards

+0

@jedwards: स्पष्ट से परे (यह कुछ आसपास के लूप या स्विच से बाहर हो जाता है, इस कोड खंड में नहीं दिखाया गया है) मुझे नहीं पता। हो सकता है कि यह कोड खंड अध्याय/पुस्तक में कहीं और इस्तेमाल किए गए कुछ कोड से लिया गया हो? उस मामले के लिए, मुझे नहीं पता कि समारोह 'प्राइम' क्या करता है। –

+0

ओह, मैं उम्मीद कर रहा था कि यह कुछ चाल थी जो मुझे [इन रत्नों] [http://www2.research.att.com/~bs/bs_faq.html) की तरह घुसपैठ कर देगी। धन्यवाद! – jedwards