यह सवाल गूंगा लग सकता है, लेकिन प्रोग्रामिंग भाषाओं के लिए किसी भी अन्य [पूर्णांक] मूल्य का 0मूल्यांकन क्यों होता है ?falsetrue
स्ट्रिंग तुलना
चूँकि प्रश्न थोड़ा सा सरल लगता है, इसलिए मैं खुद को थोड़ा और समझाऊंगा: सबसे पहले, यह किसी भी प्रोग्रामर को स्पष्ट लग सकता है, लेकिन एक प्रोग्रामिंग भाषा क्यों नहीं होगी - वास्तव में कोई भी हो सकता है, लेकिन नहीं मैंने इस्तेमाल किया - जहां और सभी [पूर्णांक] मूल्यों का 0मूल्यांकन trueकरता है false? यह एक टिप्पणी यादृच्छिक लग सकती है, लेकिन मेरे पास कुछ उदाहरण हैं जहां यह एक अच्छा विचार हो सकता है। सबसे पहले, चलो तीन-तरफा तुलनाओं का strcmpउदाहरण लेते हैं, मैं C का उदाहरण लूंगा: C कोई भी प्रोग्रामर जो C को अपनी पहली भाषा के रूप में आज़मा रहा है, वह निम्नलिखित कोड लिखने के लिए लुभा सकता है:
if (strcmp(str1, str2)) { // Do something... }
चूंकि strcmpरिटर्न 0जो कि मूल्यांकन करता है falseकि तार कब समान हैं, शुरुआत प्रोग्रामर ने जो करने की कोशिश की वह बुरी तरह से विफल हो जाता है और वह आमतौर पर समझ नहीं पाता है कि पहले क्यों। इसके बजाय 0मूल्यांकन किया गया था true, तो इस फ़ंक्शन का उपयोग इसकी सबसे सरल अभिव्यक्ति में किया जा सकता है - ऊपर वाला - जब समानता की तुलना करता है, -1और 1जरूरत पड़ने पर ही उचित जांच करता है और किया जाता था। हमने boolअधिकांश समय वापसी के प्रकार (हमारे दिमाग में मेरा मतलब है) के रूप में माना होगा ।
इसके अलावा, आइए एक नए प्रकार का परिचय दें sign, जो कि केवल मान लेता है -1, 0और 1। यह बहुत आसान हो सकता है। कल्पना कीजिए कि C ++ में एक स्पेसशिप ऑपरेटर है और हम इसे चाहते हैं std::string(ठीक है, पहले से ही compareफंक्शन है, लेकिन स्पेसशिप ऑपरेटर अधिक मजेदार है)। घोषणा वर्तमान में निम्नलिखित एक होगी:
sign operator<=>(const std::string& lhs, const std::string& rhs);
का 0मूल्यांकन किया गया था true, तो अंतरिक्ष यान ऑपरेटर भी मौजूद नहीं होगा, और हम operator==इस तरह से घोषणा कर सकते थे :
sign operator==(const std::string& lhs, const std::string& rhs);
यह एक operator==ही समय में तीन-तरह की तुलना को नियंत्रित करता था, और अभी भी निम्नलिखित जांच करने के लिए इस्तेमाल किया जा सकता है, जबकि यह जांचने में सक्षम है कि कौन सा स्ट्रिंग लेक्सिकोग्राफिक रूप से बेहतर है जब जरूरत हो।
if (str1 == str2) { // Do something... }
पुरानी त्रुटियों को संभालना
अब हमारे पास अपवाद हैं, इसलिए यह हिस्सा केवल उन पुरानी भाषाओं पर लागू होता है जहां ऐसी कोई चीज मौजूद नहीं है (उदाहरण के लिए C)। यदि हम C की मानक लाइब्रेरी (और POSIX एक भी) को देखते हैं, तो हम यह सुनिश्चित कर सकते हैं कि 0सफल होने के बाद maaaaany फ़ंक्शन वापस आए और अन्यथा कोई पूर्णांक। मैंने दुख की बात है कि कुछ लोग इस तरह की चीजें करते हैं:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
यदि हम सोचते हैं कि हम प्रोग्रामिंग में कैसे सोचते हैं, तो हमारे पास अक्सर निम्नलिखित तर्क पैटर्न होते हैं:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
अगर हम इसके बारे में फिर से विचार करते हैं, तो इसका मतलब केवल तटस्थ मूल्य को 0, टू yes(और यही है कि C के कार्य कैसे काम करते हैं) को माना जाता है, जबकि अन्य सभी मानों के कई मामलों को हल करने के लिए हो सकते हैं no। हालाँकि, मुझे पता है कि सभी प्रोग्रामिंग भाषाओं में (शायद कुछ प्रायोगिक esotheric भाषाओं को छोड़कर), जो किसी स्थिति में yesमूल्यांकन करता है , जबकि सभी मामलों का मूल्यांकन करते हैं । कई परिस्थितियां हैं जब "यह काम करता है" एक मामले का प्रतिनिधित्व करता है जबकि "यह काम नहीं करता है" कई संभावित कारणों का प्रतिनिधित्व करता है। अगर हम इसके बारे में इस तरह से सोचते हैं, तो बाकी का मूल्यांकन करने के लिए और अधिक समझ में आता है।falseifnotrue0truefalse
निष्कर्ष
मेरा निष्कर्ष अनिवार्य रूप से मेरा मूल प्रश्न है: हमने भाषाओं को क्यों डिज़ाइन किया 0है falseऔर अन्य मूल्य कहां हैं true, ऊपर मेरे कुछ उदाहरणों को ध्यान में रखते हुए और शायद कुछ और मैंने नहीं सोचा था?
अनुवर्ती: यह देखना अच्छा है कि कई विचारों के साथ कई उत्तर हैं और इसके लिए कई संभावित कारण जैसे हैं। मैं प्यार करता हूँ कि आप इसके बारे में कितना भावुक लग रहे हैं। मैंने मूल रूप से बोरियत से यह सवाल पूछा था, लेकिन जब से आप इतने भावुक लग रहे हैं, मैंने थोड़ा और आगे बढ़ने का फैसला किया और Math.SE पर बूलियन पसंद के लिए 0 और 1 के पीछे तर्क के बारे में पूछा :)
if true ; then ... ; fiजहां trueएक कमांड है जो शून्य देता है और यह ifचलाने के लिए कहता है ...।
boolप्रकार लेकिन तुलना / किसी भी वापसी मान की स्थिति आदि कर सकते हैं।
strcmp()सही या गलत के लिए कोई अच्छा उदाहरण नहीं है, क्योंकि यह 3 विभिन्न मूल्यों को लौटाता है। और जब आप एक शेल का उपयोग करना शुरू करेंगे, तो आप आश्चर्यचकित होंगे, जहां 0 का मतलब सच है और कुछ भी गलत का मतलब है।