टी एल; डॉ
C को दूसरी भाषा से विरासत में मिला !और ~ऑपरेटर। दोनों &&और ||साल बाद एक अलग व्यक्ति द्वारा जोड़ा गया था।
लंबा जवाब
ऐतिहासिक रूप से, C का विकास प्रारंभिक भाषाओं B से हुआ, जो BCPL पर आधारित था, जो CPL पर आधारित था, जो Algol पर आधारित था।
Al ++, C ++, Java और C # के परदादा , एक तरह से सही और गलत को परिभाषित करते हैं, जो प्रोग्रामर्स के लिए सहज महसूस करते हैं: "सत्य मान, जो एक बाइनरी संख्या के रूप में माना जाता है (1 के विपरीत सच और 0 से गलत), आंतरिक अभिन्न मूल्य के रूप में ही ”। हालांकि, इसका एक नुकसान यह है कि तार्किक और बिटवाइज़ एक ही ऑपरेशन नहीं हो सकते हैं: किसी भी आधुनिक कंप्यूटर पर, ~01 के बजाय -1 ~1बराबर है और 0. के बजाय -2 के बराबर है (यहां तक कि कुछ साठ वर्षीय मेनफ्रेम जहां ~0प्रतिनिधित्व करता है - 0 या INT_MIN, ~0 != 1कभी बनाया हर सीपीयू, और सी भाषा मानक पर जबकि इसके बेटी भाषाओं के सबसे भी सहायता साइन-और-परिमाण करने के लिए या one's-पूरक बिल्कुल परेशान नहीं है, कई वर्षों के लिए यह आवश्यक हो गया है।)
अल्गोल ने अलग-अलग विधाओं के साथ काम किया और ऑपरेटरों की बूलियन और इंटीग्रल मोड में अलग-अलग व्याख्या की। यही है, एक बिटवाइज़ ऑपरेशन पूर्णांक प्रकारों पर एक था, और बूलियन प्रकारों पर एक तार्किक ऑपरेशन एक था।
बीसीपीएल के पास एक अलग बूलियन प्रकार था, लेकिन बिटवाइज़ और लॉजिकल दोनों के लिए एक एकल notऑपरेटर । जिस तरह से सी के इस शुरुआती अग्रदूत ने वह काम किया था:
सच का रूल थोड़ा पैटर्न है जो पूरी तरह से लोगों से बना है; असत्य का दोष शून्य है।
ध्यान दें कि true = ~ false
(आप देखेंगे कि अवधि rvalue मतलब कुछ सी-परिवार भाषाओं में पूरी तरह से अलग करने के लिए विकसित किया गया है। हम चाहते हैं आज कॉल कि "वस्तु प्रतिनिधित्व" सी में)
यह परिभाषा तार्किक और बिटवाइज़ को एक ही मशीन-भाषा निर्देश का उपयोग नहीं करने की अनुमति देती है। यदि सी उस मार्ग पर चला गया था, तो हेडर दुनिया भर की फाइलों को कहेगा #define TRUE -1।
लेकिन बी प्रोग्रामिंग भाषा कमजोर टाइप की थी, और इसमें कोई बूलियन या फ़्लोटिंग-पॉइंट प्रकार नहीं थे। intइसके उत्तराधिकारी के रूप में सब कुछ बराबर था , सी। इसने भाषा को यह परिभाषित करने के लिए एक अच्छा विचार दिया कि क्या हुआ जब एक प्रोग्राम एक तार्किक मूल्य के रूप में सच्चे या झूठे के अलावा किसी मूल्य का उपयोग करता है। इसने पहली बार एक सत्य अभिव्यक्ति को "शून्य के बराबर नहीं" के रूप में परिभाषित किया था। यह मिनीकॉम्प्यूटर पर कुशल था, जिस पर यह चलता था, जिसमें सीपीयू शून्य ध्वज था।
उस समय, एक विकल्प: एक ही सीपीयू में एक नकारात्मक ध्वज भी था, और बीसीपीएल का सत्य मूल्य -1 था, इसलिए बी ने संभवतः सभी नकारात्मक संख्याओं को सत्य और सभी गैर-नकारात्मक संख्याओं को मिथ्या के रूप में परिभाषित किया। (इस दृष्टिकोण का एक अवशेष है: यूनिक्स में कई सिस्टम कॉल, एक ही समय में एक ही लोगों द्वारा विकसित, सभी त्रुटि कोड को नकारात्मक पूर्णांक के रूप में परिभाषित करता है। इसके कई सिस्टम कॉल विफलता पर कई अलग-अलग नकारात्मक मूल्यों में से एक को वापस करते हैं।) आभारी रहें: यह बदतर हो सकता था!
लेकिन परिभाषित करने TRUEके रूप में 1और FALSEके रूप में 0बी में मतलब है कि पहचान true = ~ falseअब नहीं पहना है, और यह मजबूत टाइपिंग कि बिटवाइज़ और तार्किक अभिव्यक्ति को स्पष्ट करने के लिए अल्गोल अनुमति छोड़ दिया था। इसके लिए एक नए लॉजिकल-ऑपरेटर की आवश्यकता नहीं थी, और डिज़ाइनरों ने उठाया !, संभवतः क्योंकि बराबर-से-पहले से ही नहीं था !=, जो समान चिह्न के माध्यम से एक ऊर्ध्वाधर बार की तरह दिखता है। वे के रूप में ही सम्मेलन का पालन नहीं किया &&या ||क्योंकि न तो अभी तक अस्तित्व में।
यकीनन, उनके पास होना चाहिए: &बी में ऑपरेटर को डिज़ाइन के अनुसार तोड़ा गया है। बी और सी में, में 1 & 2 == FALSEभले ही 1और 2दोनों truthy मान रहे हैं, और वहाँ बी में तार्किक आपरेशन यही कारण है कि एक गलती सी आंशिक रूप से जोड़कर सुधारने की कोशिश की व्यक्त करने के लिए कोई सहज तरीका है &&और ||है, लेकिन समय पर मुख्य चिंता करने के लिए था अंत में काम करने के लिए शॉर्ट-सर्कुलेटिंग करें, और प्रोग्राम तेज चलाएं। इसका प्रमाण यह है कि कोई सत्य नहीं है ^^: 1 ^ 2एक सत्य मूल्य है भले ही उसके दोनों ऑपरेंड सत्य हैं, लेकिन यह शॉर्ट-सर्कुलेटिंग से लाभ नहीं उठा सकता है।