बूलियन सोचो, बिट्स नहीं
संक्षेप में, आपके प्रोफेसर का समाधान बेहतर है (लेकिन अभी भी गलत है, सख्ती से बोलना, आगे नीचे देखें) क्योंकि यह बिटवाइज ऑपरेटरों के बजाय बूलियन ऑपरेटरों का उपयोग करता है और बूलियंस को पूर्णांक के रूप में मानता है। c==1
"C सत्य है" को दर्शाने की अभिव्यक्ति गलत है क्योंकि यदि c एक संख्या हो सकती है (बताए गए असाइनमेंट के अनुसार) तो c के किसी भी गैर-शून्य मान को प्रतिनिधित्व माना जाना है true
।
इस सवाल को देखें कि 0 या 1 के साथ बूलियन की तुलना करना बेहतर क्यों नहीं है, भले ही ऐसा करना सुरक्षित हो।
उपयोग न करने का एक बहुत अच्छा कारण यह xor
है कि यह बिट-वार एक्सक्लूसिव या ऑपरेशन है। यह अपने उदाहरण में काम करने के लिए होता है क्योंकि दोनों बाएं हाथ की ओर और दाहिने हाथ की ओर बूलियन अभिव्यक्ति है कि परिवर्तित करने के लिए 1 या 0 (फिर से देख रहे हैं 1 )।
बूलियन अनन्य-या वास्तव में है !=
।
अभिव्यक्ति को तोड़ना
अपने प्रोफेसर के समाधान को बेहतर ढंग से समझने के लिए, बूलियन ऑपरेटरों को उनके "वैकल्पिक टोकन" समकक्षों के साथ बदलना आसान है, जो इसे बेहतर रिडेबल (imho) में बदल देता है और पूरी तरह से बराबर C ++ कोड: 'for' का उपयोग नहीं कर रहा है! ' और 'और' के लिए '&&' आपको मिलता है
(not a and not b) != c
दुर्भाग्य से, इसके अलावा कोई तार्किक exclusive_or
ऑपरेटर नहीं है not_eq
, जो इस मामले में सहायक नहीं है।
यदि हम प्राकृतिक भाषा की अभिव्यक्ति को तोड़ते हैं:
या तो ए और बी दोनों झूठे हैं या सी सच है, लेकिन दोनों नहीं।
बूलियन प्रस्ताव ए और बी के बारे में पहला वाक्य:
या तो ए या बी, लेकिन दोनों नहीं।
यह A != B
केवल (बुलियन के लिए, किसी भी प्रकार ए और बी के लिए) में अनुवाद करता है।
तब प्रस्ताव A था
ए और बी दोनों झूठे हैं
जिसे कहा जा सकता है
a गलत है और b गलत है
जो (not a and not b)
अंत में अनुवाद करता है , और अंत में
c सत्य है
जिसका बस अनुवाद किया जाता है c
। उन्हें मिलाकर आप फिर से मिल जाते हैं (not a and not b) != c
।
आगे की व्याख्या के लिए कि यह अभिव्यक्ति कैसे काम करती है, मैं उन सत्य तालिकाओं को टालता हूं जो दूसरों ने अपने उत्तर में दी हैं।
तुम दोनों गलत हो
और अगर मैं नाइटपिक कर सकता हूं: मूल असाइनमेंट में कहा गया है कि ए, बी और सी गैर-नकारात्मक संख्या हो सकती है, लेकिन स्पष्ट रूप से यह नहीं बताया गया है कि यदि वे संख्याएं थीं, तो उन्हें मान 0 और 1 तक सीमित होना चाहिए। यदि कोई संख्या है तो true
प्रथागत के रूप में 0 का प्रतिनिधित्व नहीं करता है, तो निम्न कोड एक आश्चर्यजनक उत्तर देगा :
auto c = 2; // "true" in some way
auto a = 0; // "false"
auto b = 0; // "false"
std::cout << ((!a && !b) != c);
// this will output: 1 (!)
// fix by making sure that != compares booleans:
std::cout << ((!a && !b) != (bool)c);
a == b or c
इसके बजाय "ए बराबर बी या सी" का अनुवाद करना हैa == b or a ==c
। समस्या यह है कि बोला जाने वाला