2013-02-21 23 views
11

मैं कुछ सी ++ कोड लिख रहा हूं, और मैं दो फ़ंक्शंस (checkXDirty और checkYDirty) कॉल करना चाहता हूं, और true लौटाएं यदि true लौटाता है। दोनों भले ही एक true देता है, तो मेरा पहला विचारहै (बूल | बूल) सुरक्षित?

return checkXDirty() | checkYDirty(); 

का इस्तेमाल किया गया यह एक छोटे से अजीब (गंदा, शायद) लग रहा है मैं मूल्यांकन करने की जरूरत। क्या यह हमेशा सी ++ में सही परिणाम उत्पन्न करता है? _Bool प्रकार के साथ सी के बारे में क्या? (यह कोड किसी भी भाषा के लिए अनुकूलित किया जा सकता है, और जब मैं कोड पोर्ट करता हूं तो मुझे अप्रिय आश्चर्य नहीं चाहिए)।

+3

शाबाशी, शाबाशी: बस चर में मूल्यों स्टोर करने के लिए है, लेकिन फिर const जोड़ सकता हूँ, इस तरह शायद उतना ही अच्छा है। खैर, मैं कहूंगा कि साइड इफेक्ट्स के साथ 'कुछ()' कार्यों को रखना वास्तव में बुरा विचार है। – Andrey

+0

@ एंड्रे: अच्छा बिंदु। मैं फ़ंक्शंस का नाम बदलकर 'चेक ...' कर दूंगा। – nneonneo

+2

@ मिच व्हाट्स उनके पास थोड़ा सा सर्किट मूल्यांकन से बचने के लिए थोड़ा सा है या ठीक है। – juanchopanza

उत्तर

46

मैं मूल्यांकन करने के लिए दोनों भले ही एक सच देता है, तो मेरा पहला विचार का इस्तेमाल किया गया जरूरत है ...

तब मुश्किल हो करने की कोशिश कर बंद करो और संभव के रूप में कुछ पंक्तियों में अपने कोड फिट बनाने । बस दोनों कार्यों कॉल और यह स्पष्ट है कि वे कहा जा करने की जरूरत है कि बनाने:

const bool x_dirty = is_x_dirty(); 
const bool y_dirty = is_y_dirty(); 
return x_dirty || y_dirty; 

इसके बाद, नाम बदलें या is_xxx_dirty के रूप में अपने कार्यों तोड़ वास्तव में नहीं दुष्प्रभाव उत्पादन होना चाहिए। परिणामस्वरूप

+0

मैंने उन्हें बदलकर 'चेक *' कर दिया क्योंकि 'है *' भ्रामक था। धन्यवाद। – nneonneo

+3

@ एननेनो: मैं कहूंगा कि अभी भी भ्रामक है। मैं उन कार्यों में से किसी एक दुष्प्रभाव का उत्पादन करने की उम्मीद नहीं करता। –

+4

+1 मैंने एक बार 'है' के साथ एक ही हैक की कोशिश की और मेरे कोड में मूल्यांकन मूल्यांकन के आदेश को भूल गया। –

8

जब तक मान अनिश्चित नहीं हैं, तब तक आपके कोड को बनाए रखने के लिए कठिन है, यह तकनीकी रूप से बिटवाई ऑपरेटरों का उपयोग करने के लिए ठीक है। हालांकि, चूंकि यह सामान्य कोडिंग आदत के रूप में समस्याओं से भरा हुआ है, इसलिए मैं बस थोड़ा इनलाइन या-फ़ंक्शन लिखूंगा, और संकलक को अनुकूलित करने दें। संकलक अनुकूलन में अच्छा है, इसलिए, इसे चलो।

return eitherOrBothTrue(checkXDirty(), checkYDirty()); 

या शायद, अगर आप बोल्ड कर रहे हैं और जो लोग इसे बनाए रखेंगे कोड समझा की चुनौती पर लेने के लिए हिम्मत,

return !bothFalse(checkXDirty(), checkYDirty()); 

या अब है कि मैं @EdS 'जवाब पढ़ा है,

bool const xIsDirty = checkXDirty(); 
bool const yIsDirty = checkYDirty(); 
return xIsDirty || yIsDirty; 
संबंधित मुद्दे