2016-11-24 12 views
8

में फ़ंक्शन लौटने वाले बूल के साथ मैंने एक प्रोग्राम लिखा है जो सामान के एक सेट में त्रुटियों को सूचीबद्ध करता है, और अंत में एक बूलियन मान देता है (वास्तविक अर्थ लौटाता है कि कोई त्रुटि नहीं मिली है)। मैं विश्वास result का मूल्य अंत में सही होगाबिटवाई और सी ++

bool checkStuff1() {/*...*/} 
bool checkStuff2() {/*...*/} 
// ... 
bool checkStuffN() {/*...*/} 

bool checkAllStuff() 
{ 
    bool result = true; 
    result &= checkStuff1(); 
    result &= checkStuff2(); 
    // ... 
    result &= checkStuffN(); 
    return result; 
} 

:

यहाँ मेरी कोड का सार है। हालांकि, मैं यह सुनिश्चित करना चाहता हूं कि सभी कार्यों checkStuffX() को कॉल किया जाता है (क्योंकि वे असफल होने पर त्रुटि संदेश प्रिंट करते हैं, और मैं सभी त्रुटि संदेशों को मुद्रित करना चाहता हूं)।

मुझे पता है कि अगर मैं इस तरह से लिखा है, यह पहले एक विफल होने के बाद सभी checkStuffX() छोड़ जाएगा:

result = result && checkStuffX(); // Will not call checkStuffX() if result is already false 

मुझे यह भी पता है कि अगर मैं इस तरह से लिखा है, यह सब checkStuffX() कार्यों कॉल करेगा:

result = checkStuffX() && result; // Will always call checkStuffX() even if result is false 

लेकिन मैं सोच रहा था कि कोड के व्यवहार का उपयोग मैं थोड़ा सा तुलनात्मक रूप से कर रहा हूं, मानक द्वारा निर्धारित और गारंटीकृत है?

या क्या संकलक और उसके अनुकूलन के आधार पर अपरिभाषित व्यवहार का जोखिम है?

+1

आप 'बूल असफल = झूठी का भी उपयोग कर सकते हैं; में विफल रहा है | = checkStuff1(); असफल | =! checkStuff2(); ... असफल | =! checkStuffN(); वापसी! असफल; '। यह सरल नियम (ए और बी बी) =! (! ए ||! बी) –

उत्तर

9

यह बिल्कुल ठीक है।

शॉर्ट-सर्किट मूल्यांकन, जिसका आप उल्लेख कर रहे हैं, केवल && और || ऑपरेटरों पर लागू होता है।

+0

संबंधित है: http://stackoverflow.com/questions/2488406/why-doesnt-c-have-or-for-booleans –

+0

क्या वहां है कुछ ऐसा गारंटी देता है जो किसी भी मामले में ऑपरेटर और = के साथ कोई शॉर्ट-सर्किट मूल्यांकन (या समान अनुकूलन) नहीं होगा? मेरा मतलब है, एक्स == 0 एक्स == 0 के साथ एक्स हमेशा एक्स == 0 के साथ समाप्त होगा जो वाई का मूल्य है। मैं यह सुनिश्चित करना चाहता हूं कि जो भी कंपाइलर उपयोग किया जाता है, व्यवहार हर जगह एक जैसा होगा, और वाई() को बुलाया जाएगा यदि यह एक समारोह है। क्या मानकों में कुछ ऐसा है जो इसकी गारंटी देता है? – teupoui

+0

हां, यह बूलियन बीजगणित की परिभाषा द्वारा गारंटीकृत है। यदि एक ऑपरेंड में सभी बिट्स 0 हैं, तो bitwise '&' ऑपरेटर का परिणाम 0 –

0

यह काम करेगा, हालांकि रूपांतरण int < -> यदि आपके पास कई चेक हैं तो बूल शायद प्रदर्शन समस्या हो सकती है। ओह, आप फंक्शन पॉइंटर्स और लूप के लिए लाभ ले सकते हैं, यदि सभी कार्यों में एक ही प्रकार है।

bool (*checks[])(void)= {checkStuff1, checkStuff2 ... checkStuffN}; 

bool result = true; 
for (int i = 0; i < sizeof(checks)/sizeof(checks[0]); result = checks[i++]() && result); 

कोड सरल लगेगा कि वह आपके लिए लेकर उपयोग कर सकते हैं() - for(auto i : checks) की तरह। इसका लाभ यदि आपके पास कोड में कहीं और घोषित प्रक्रिया है, तो उसे हटाने या जोड़ने की आवश्यकता है, तो आप सरणी की घोषणा को संशोधित करें (या आपका प्रोग्राम इसे बदल सकता है, प्रभावी रूप से वर्कफ़्लो को बदल रहा है!)। डाउनसाइड - आप इसे उन चेक के साथ उपयोग नहीं कर सकते हैं जिनमें विभिन्न प्रोटोटाइप हैं।

+0

इससे मेरे मामले में बहुत मदद नहीं मिलेगी ...मैंने अपने प्रश्न को सरल बना दिया है: जांच कार्य प्रत्येक बार अलग-अलग पैरामीटर लेते हैं। लेकिन फिर भी धन्यवाद ! – teupoui

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