बूलियन C ++ सपोर्ट ++ में क्यों टाइप करता है लेकिन नहीं -?


29

ऑपरेटर --बूल के लिए मौजूद क्यों नहीं है जबकि यह ऑपरेटर के लिए है ++?

मैंने C ++ में कोशिश की, और मुझे नहीं पता कि मेरा प्रश्न दूसरी भाषा पर लागू होता है या नहीं। मुझे भी जानकर खुशी होगी।

मुझे पता है , मैं ++एक बूल के साथ ऑपरेटर का उपयोग कर सकता हूं । यह किसी भी बूल को सच के बराबर बनाता है।

bool b = false;
b++;
// Now b == true.

हम ऑपरेटर --का विपरीत तरीके से उपयोग क्यों नहीं कर सकते ?

bool b = true;
b--;
// Now b == false;

यह बहुत उपयोगी नहीं है, लेकिन मैं उत्सुक हूं।


8
StackOverflow पर यह प्रश्न ज्ञानवर्धक हो सकता है।
ब्लरफ्ल

तो इतिहास कारण। लिंक के लिए आपको धन्यवाद। क्या आप उत्तर लिख सकते हैं और मैंने इसे हल कर दिया है?
अलयसडग का कहना है कि

अकेले लिंक अच्छे उत्तर नहीं देते हैं, और tnis को चिह्नित करने के लिए एक अच्छा तंत्र नहीं है जो किसी अन्य एसई साइट पर किसी चीज़ की नकल करता है।
ब्लरफाल

1
इसलिए हमें meta.stackexchange.com या कुछ में एक विषय खोलना चाहिए। मुझे लगता है कि आपको अच्छे लिंक के लिए कुछ कर्म प्राप्त करने चाहिए और यदि कोई आपको उकसाता है, तो मूल उत्तर से लेखक को कुछ कर्म प्राप्त करने चाहिए। वास्तव में, मूल प्रश्न को कुछ कर्म मिलना चाहिए।
aloisdg

2
@aloisdg क्रॉस साइट डूप एमएसओ पर एक पुराना मुद्दा है। जुड़े सवालों का पीछा करते हुए इसके बारे में पूरी जानकारी हासिल करें।

जवाबों:


53

C के पुराने दिनों में, कोई बूलियन प्रकार नहीं था। लोग intबूलियन डेटा संग्रहीत करने के लिए उपयोग करते थे, और यह ज्यादातर काम करता था। ज़ीरो झूठ था और बाकी सब सच था।

इसका मतलब यह था कि अगर आपने एक लिया int flag = 0;और बाद में किया flag++तो मूल्य सही होगा। इससे कोई फर्क नहीं पड़ता कि ध्वज का मूल्य क्या था (जब तक कि आपने इसे बहुत अधिक नहीं किया था, यह लुढ़का हुआ था और आप शून्य पर वापस आ गए, लेकिन इसे अनदेखा करते हैं) - ध्वज को बढ़ाते हुए जब उसका मूल्य 1 था तो 2 देंगे, जो अभी भी था सच।

कुछ लोगों ने इसका इस्तेमाल बिना शर्त मूल्य को सच मानने के लिए किया। मुझे यकीन नहीं है कि यह कभी मुहावरेदार हो गया है , लेकिन इसके कुछ कोड में।

इसके लिए कभी काम नहीं किया गया --, क्योंकि यदि मूल्य 1 के अलावा कुछ भी था (जो यह हो सकता है), तो मूल्य अभी भी गलत नहीं होगा। और अगर यह पहले से ही गलत था ( 0) और आपने इस पर एक डिक्रीमेंट ऑपरेटर किया, तो यह गलत नहीं होगा।

जब शुरुआती दिनों में C से C ++ में कोड बढ़ रहा था, तो यह बहुत महत्वपूर्ण था कि C ++ में शामिल C कोड अभी भी काम करने में सक्षम था। और इसलिए C ++ के लिए विनिर्देशन में (खंड ५.२.६ (पृष्ठ )१ पर)) यह पढ़ता है:

पोस्टफ़िक्स ++ लागू करने से प्राप्त मूल्य वह मान है जो ऑपरेटर को लागू करने से पहले ऑपरेटर के पास था। [नोट: प्राप्त मूल्य मूल मूल्य की एक प्रति है] ऑपरेंड एक परिवर्तनीय अंतराल होगा। ऑपरेंड का प्रकार एक अंकगणितीय प्रकार या पूर्ण ऑब्जेक्ट प्रकार के लिए एक सूचक होगा। परिणाम नोट किए जाने के बाद, ऑब्जेक्ट का मान 1 में जोड़कर संशोधित किया जाता है, जब तक कि ऑब्जेक्ट प्रकार का नहीं होता है bool, जिस स्थिति में यह सही पर सेट होता है। [नोट: इस उपयोग को हटा दिया गया है, देखें अनुलग्नक डी।]

पोस्टफिक्स का ऑपरेंड - पोस्टफिक्स ++ ऑपरेटर के अनुरूप समान रूप से घटाया जाता है, सिवाय इसके कि ऑपरेंड टाइप का नहीं होगा bool

यह फिर से खंड 5.3.2 में वर्णित है (उपसर्ग ऑपरेटर के लिए - 5.2.6 पोस्टफिक्स पर था)

जैसा कि आप देख सकते हैं, यह पदावनत है (दस्तावेज़ 709 में अनुलग्नक डी) और इसका उपयोग नहीं किया जाना चाहिए।

लेकिन ऐसा क्यों। और कभी-कभी आप कोड देख सकते हैं। लेकिन यह मत करो।


5
"कुछ लोगों ने इसका इस्तेमाल बिना शर्त मूल्य को सच करने के लिए किया।" चलो उन्हें लोग मूर्ख नहीं, मूर्ख कहते हैं।
डिडुप्लीकेटर

@Deduplicator: हो सकता है कि यह प्रदर्शन की बात थी: एक चर में मूल्य लोड करने से चर को बढ़ाने की तुलना में अधिक प्रोसेसर चक्र हो सकता है। बेशक, यह शायद आधुनिक कंप्यूटर पर कोई फर्क नहीं पड़ता।
जियोर्जियो

1
@ जिओर्जियो जो काफी संभावना है। याद रखें कि C को PDP-7 इंस्ट्रक्शन सेट और PDP-11 की अन्य बारीकियों को बारीकी से मिलाने के लिए लिखा गया था। से इस - "लोग अक्सर, लगता है कि वे स्वत: वेतन वृद्धि और ऑटो घटती पता दिसम्बर पीडीपी 11 जिस पर सी और यूनिक्स पहले से लोकप्रिय हो गया द्वारा प्रदान मोड का उपयोग करने के लिए बनाया गया था यह ऐतिहासिक रूप से असंभव है के बाद से वहाँ कोई PDP- था। 11 जब बी विकसित किया गया था। पीडीपी -7, हालांकि, कुछ `ऑटो-इन्क्रीमेंट 'मेमोरी सेल था, इस संपत्ति के साथ कि उनके माध्यम से एक अप्रत्यक्ष मेमोरी संदर्भ सेल को बढ़ाता था।"

@ डेडप्लिकेटर: बूलियन्स के लिए पूर्णांक का उपयोग करने वाले कोड में, एक चर जो प्रत्येक के लिए बढ़ा हुआ है ... जो भी ... दोनों एक काउंटर के रूप में कार्य कर सकते हैं (कितनी बार यह वृद्धि हुई थी) और एक बूलियन के रूप में (क्या यह सभी में वृद्धि हुई है) नहीं)।
कीथ थॉम्पसन

2

विरासत कोड के साथ आंशिक रूप से सामना करने के लिए जो intअपने बूलियन प्रकार के रूप में उपयोग या समान था।


1
मेरा प्रश्न यहाँ से एक डुप्लिकेट है stackoverflow.com/questions/3450420/… । वैसे, आपके उत्तर के लिए धन्यवाद।
एलोइसडग कहते हैं

1

इस प्रश्न के ऐतिहासिक महत्व को समझने के लिए, आपको थेरैक -25 के मामले पर विचार करना चाहिए। थेरैक -25 एक चिकित्सा उपकरण था जिसने कैंसर रोगियों को विकिरण दिया। यह खराब प्रोग्रामिंग प्रथाओं से ग्रस्त था, जिसने इसके खराब सुरक्षा ट्रैक रिकॉर्ड (इसके लिए कई मौतों के साथ) में योगदान दिया था।

http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html

(पेज 3 के नीचे जाएं)

सेट-अप टेस्ट रुटीन से होकर गुजरने वाला प्रत्येक ऊपरी कोलाइमर स्थिति की जाँच करता है, एक साझा चर जिसे Class3 कहा जाता है। यदि Class3 नॉनज़ेरो है, तो असंगति है और उपचार आगे नहीं बढ़ना चाहिए। Class3 के लिए एक शून्य मान इंगित करता है कि संबंधित पैरामीटर उपचार के अनुरूप हैं, और बीम बाधित नहीं है।

...

मशीन सेटअप के दौरान, सेट-अप टेस्ट को कई सौ बार निष्पादित किया जाएगा, क्योंकि यह फिर से शुरू होने वाली अन्य घटनाओं की प्रतीक्षा कर रहा है। कोड में, Class3 चर सेट-अप टेस्ट के माध्यम से प्रत्येक पास में से एक से बढ़ा हुआ है। चूंकि Class3 चर 1 बाइट है, इसमें केवल 255 दशमलव का अधिकतम मान हो सकता है। इस प्रकार, प्रत्येक 256 वें सेट-अप टेस्ट कोड के माध्यम से, चर ओवरफ्लो होता है और शून्य मान होता है। इसका मतलब है कि सेट-अप टेस्ट से गुजरने वाले प्रत्येक 256 वें पर, ऊपरी समापक की जाँच नहीं की जाएगी और एक अपर समापक दोष का पता नहीं लगाया जाएगा। ओवरएक्सपोजर तब हुआ जब ऑपरेटर ने सटीक सेट पर "सेट" बटन मारा जो क्लास 3 शून्य पर लुढ़का। इस प्रकार Chkcol को अंजाम नहीं दिया गया था, और F $ mal को इंगित करने के लिए सेट नहीं किया गया था कि ऊपरी संपीड़ित अभी भी फ़ील्ड-लाइट स्थिति में था। बिना टारगेट और बिना स्कैनिंग के पूरे 25 MeV पर सॉफ्टवेयर चालू हो गया। एक अत्यधिक संकेन्द्रित इलेक्ट्रॉन किरण उत्पन्न हुई, जो मार्ग में लगे स्टेनलेस स्टील के दर्पण द्वारा बिखरी और विक्षेपित थी।

Therac -25 प्रयुक्त कुछ के बराबर की तरह operator++एक पर bool। हालाँकि, उनके द्वारा उपयोग की जाने वाली प्रोग्रामिंग भाषा C ++ नहीं थी, और उनका डेटा प्रकार नहीं था bool। C ++ में गारंटी के विपरीत, हालांकि, एक नियमित पूर्णांक प्रकार बस ऊपर जा रहा है। उनके डेटा प्रकार के बराबर था uint8_t

C ++ ने operator++इस तरह की प्रोग्रामिंग करने वाले लोगों के लिए आस-पास रखने का फैसला किया, लेकिन मूल्य में वृद्धि के बजाय, यह बस trueइस तरह की चीजों को रोकने के लिए इसे सेट करता है ।

ध्यान दें कि operator++(bool)पदावनत किया जाता है।

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

C ++ 14 का अनुलग्नक D:

डी 1 इंक्रीमेंट ऑपरेटर बूल ऑपरेंड के
साथ ++ ऑपरेटर के साथ टाइप बूल के एक ऑपरेंड का उपयोग घटाया जाता है (5.3.2 और 5.2.6 देखें)।


हालांकि यह समझाता है कि इसका पदावनत क्यों किया गया, यह स्पष्ट नहीं करता है कि यह पहले स्थान पर क्यों है।

यह मौजूद है क्योंकि कुछ लोग थे जिन्होंने सी। सी ++ में प्रोग्रामिंग करते समय इसे बढ़ाकर एक बूलियन मान निर्धारित किया था ताकि सी से संक्रमण को कम किया जा सके, इसलिए उन्होंने इसे boolप्रकार के साथ समर्थन किया । मैं बस एक ऐतिहासिक उदाहरण देने की कोशिश कर रहा था जब लोग वास्तव में इस तरह से प्रोग्राम करते थे।
डेविड स्टोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.