यह सवाल गूंगा लग सकता है, लेकिन प्रोग्रामिंग भाषाओं के लिए किसी भी अन्य [पूर्णांक] मूल्य का 0
मूल्यांकन क्यों होता है ?false
true
स्ट्रिंग तुलना
चूँकि प्रश्न थोड़ा सा सरल लगता है, इसलिए मैं खुद को थोड़ा और समझाऊंगा: सबसे पहले, यह किसी भी प्रोग्रामर को स्पष्ट लग सकता है, लेकिन एक प्रोग्रामिंग भाषा क्यों नहीं होगी - वास्तव में कोई भी हो सकता है, लेकिन नहीं मैंने इस्तेमाल किया - जहां और सभी [पूर्णांक] मूल्यों का 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
मूल्यांकन करता है , जबकि सभी मामलों का मूल्यांकन करते हैं । कई परिस्थितियां हैं जब "यह काम करता है" एक मामले का प्रतिनिधित्व करता है जबकि "यह काम नहीं करता है" कई संभावित कारणों का प्रतिनिधित्व करता है। अगर हम इसके बारे में इस तरह से सोचते हैं, तो बाकी का मूल्यांकन करने के लिए और अधिक समझ में आता है।false
if
no
true
0
true
false
निष्कर्ष
मेरा निष्कर्ष अनिवार्य रूप से मेरा मूल प्रश्न है: हमने भाषाओं को क्यों डिज़ाइन किया 0
है false
और अन्य मूल्य कहां हैं true
, ऊपर मेरे कुछ उदाहरणों को ध्यान में रखते हुए और शायद कुछ और मैंने नहीं सोचा था?
अनुवर्ती: यह देखना अच्छा है कि कई विचारों के साथ कई उत्तर हैं और इसके लिए कई संभावित कारण जैसे हैं। मैं प्यार करता हूँ कि आप इसके बारे में कितना भावुक लग रहे हैं। मैंने मूल रूप से बोरियत से यह सवाल पूछा था, लेकिन जब से आप इतने भावुक लग रहे हैं, मैंने थोड़ा और आगे बढ़ने का फैसला किया और Math.SE पर बूलियन पसंद के लिए 0 और 1 के पीछे तर्क के बारे में पूछा :)
if true ; then ... ; fi
जहां true
एक कमांड है जो शून्य देता है और यह if
चलाने के लिए कहता है ...
।
bool
प्रकार लेकिन तुलना / किसी भी वापसी मान की स्थिति आदि कर सकते हैं।
strcmp()
सही या गलत के लिए कोई अच्छा उदाहरण नहीं है, क्योंकि यह 3 विभिन्न मूल्यों को लौटाता है। और जब आप एक शेल का उपयोग करना शुरू करेंगे, तो आप आश्चर्यचकित होंगे, जहां 0 का मतलब सच है और कुछ भी गलत का मतलब है।