आपको C ++ में बूल का उपयोग कब करना चाहिए?


34

हमारे पास हमारी कक्षा के लिए एक असाइनमेंट था जहाँ हमें टिक-टैक- टू गेम बनाना था। लोग खुद को जटिल बनाना पसंद करते हैं, इसलिए उन्होंने जटिल गेम लिखा जिसमें मेनू शामिल थे। खेल के अंत में, आपके पास फिर से खेलने या कार्यक्रम छोड़ने का विकल्प था। मैंने एint लिए चर का , लेकिन मैंने कुछ सहपाठियों को BOOLs का उपयोग करते हुए देखा।

क्या यह अधिक कुशल है? क्या अंतर है, एक जवाब को संग्रहीत करने के बीच जो केवल intएक बूल में संग्रहीत करने के बजाय दो मूल्यों को संग्रहीत करना चाहिए ? इन चरों का सटीक उद्देश्य क्या है?


32
क्षमता के बारे में निश्चित नहीं है, लेकिन एक के उद्देश्य के intलिए एक पूर्णांक को स्टोर करना है और एक का उद्देश्य boolबूलियन मूल्य ( trueया false) को संग्रहीत करना है । boolIMO का उपयोग करने से इसका उपयोग बेहतर तरीके से प्रदर्शित होता है int
जॉर्ज डकेट

12
वास्तव में, C ++ और C99 से पहले, C89 में बूलियन प्रकार नहीं था। प्रोग्रामर अक्सर typedef int Boolयह स्पष्ट करने के लिए कि वे एक बूलियन का उपयोग कर रहे थे। C ++ boolभाषा में एकीकृत समर्थन करता है, जैसा कि C99 ने (बल्कि बदसूरत) _Boolकीवर्ड के साथ किया था ।
चार्ल्स साल्विया

यह "पता नहीं कब उपयोग करना है bool" के बारे में है, यह इस बारे में है कि हमारे पास समान प्रकार (जैसे length_t) के लिए अलग-अलग नाम क्यों हैं और यह क्यों महत्वपूर्ण है कि संकलक के प्रकार।
अब्येक

कभी-कभी इसका जवाब सिर्फ 'स्वाद' होता है। मैं शर्त लगाता हूं कि अगर आप अपने उसी असाइनमेंट को फिर से लिखते हैं तो इस पल में कई चीजें अलग होंगी जैसे कि फंक्शन पैरामीटर ऑर्डर और उनके नाम। आपने इसे एक ही पैरामीटर ऑर्डर या एक ही नाम क्यों नहीं लिखा? इसका कारण यह है कि आप बस नहीं थे या यह बहुत महत्वपूर्ण नहीं था और आपने अभी जो कुछ भी लिखा है

जवाबों:


82

चर प्रकार और चर नाम चुनते समय आप चाहते हैं कि आपका इरादा यथासंभव स्पष्ट हो। यदि आप एक bool(बूलियन) प्रकार चुनते हैं , तो यह स्पष्ट है कि केवल दो स्वीकार्य मूल्य हैं: trueया false। यदि आप एक int(पूर्णांक) प्रकार का उपयोग करते हैं , तो यह अब स्पष्ट नहीं है कि उस चर का आशय केवल 1 या 0 हो सकता है या आपके द्वारा चुने जाने वाले मूल्यों को trueऔर false। प्लस sizeof(int)आमतौर पर 4 बाइट्स के रूप में sizeof(bool)वापस आ जाएगा , जबकि 1 वापस आ जाएगा।


7
माना। मुझे लगता है कि डिजाइन के इरादे ज्यादा महत्वपूर्ण हैं। केवल कभी-कभी आपको उन्हें ओवरराइड करने की आवश्यकता होगी।
ChrisF

9
@ एंड्रयूफिनलाइन बिंदु को पुनर्स्थापित करने के लिए: बूल अधिक स्व-दस्तावेजीकरण है। एक वैरिएबल जिसे आपने 0 या 1 पर सेट किया था, वह एक काउंटर हो सकता है; एक चर जिसे आप सही या गलत पर सेट करते हैं वह स्पष्ट रूप से एक ध्वज है।
स्कॉट सी विल्सन

2
बूल अन्य उपयोगों के लिए एक चर के दुरुपयोग को रोकते हैं। एक पूर्णांक 0 या 1 के अलावा अन्य मानों पर सेट किया जा सकता है ताकि अतिरिक्त राज्यों को आपके कोड की जानकारी न हो।
माइकल शोपिन

+1। यह आशय / विकल्प स्पष्ट करता है। आप किसी भी विधि का उपयोग कर सकते हैं जिसे आप "हाँ" या "नहीं" मान के साथ एक स्ट्रिंग सहित मान को स्टोर करना चाहते हैं, लेकिन आपको उस विकल्प को चुनना चाहिए जो MOST समझ में आता है। इस मामले में, यह एक बूलियन है।
क्रेग

मैंने सोचा कि C ++ में बूलियन, आकार में 4 बाइट्स के समान थे।
डॉगडॉग

53

यह सब (अब तक) एकत्र जवाब में लगता है कोई तथ्य यह है कि ओपी के बारे में बात पकड़ा BOOLनहीं bool

चूंकि प्रश्न C ++ का टैग है, इसलिए यह ध्यान दिया जाना चाहिए कि:

  • intएक पूर्णांक है कि पर्वतमाला है INT_MINकरने के लिए INT_MAXमैक्रो में परिभाषित किया - <climits>जिनके मान होस्टिंग मशीन की वास्तुकला पर निर्भर हैं। C ++ में ये मान क्रमशः std::numeric_limits<int>::min()और ...:max()क्रमशः भी सुलभ हैं)। बूलियन ऑपरेटरों के व्यवहार के लिए लागू किया intइलाज 0के रूप में झूठी और के रूप में सब कुछ सच
  • BOOLसिर्फ एक संकेत एक इंट के लिए एक बूलियन व्यवहार का सुझाव दे रहा है। यह रूप में परिभाषित किया <cstddef>गया है

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLसंकलक चीनी से अधिक कुछ भी नहीं है, इसके लिए संकलक- यह एक इंट से अधिक कुछ नहीं है। यह कुछ सी प्रोग्रामर का उपयोग है, लेकिन सी ++ प्रोग्रामर से बचना चाहिए, क्योंकि सी ++ के पास है bool

  • boolएक भाषा अभिन्न प्रकार है जिसका समर्थित मूल्य सिर्फ trueऔर सिर्फ है false। जब परिवर्तित int true1 falseहो जाता है और 0 हो जाता है।

महत्वपूर्ण पहलू यह है कि यह प्रोग्रामिंग गलतियों के खिलाफ अधिक सुरक्षित है:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

उचित बूल प्रकार के साथ कोड करना असंभव है:

bool a = false;
a = 5; // error: no bool(const int&) available.

BOOLइसके बजाय का उपयोग करना boolएक गौरवशाली अतीत से विरासत में मिली एक बुरी आदत है, जो वास्तव में अभी भी भूलने में सक्षम नहीं है, इस प्रकार कम गौरवशाली कल के लिए पुरानी समस्या पैदा हो रही है।

भाषा शिक्षकों को इसके बारे में गंभीरता से सोचना चाहिए!


9
BOOL C ++ का हिस्सा नहीं है और न ही C भाषा का। बीओएल ऊपरी-केस अक्षरों के साथ सबसे आम तरीका है बूलियन को सी में लागू किया गया था, पुराने दिनों में जब सी में कोई मलिन प्रकार नहीं था। उदाहरण के लिए, विंडोज एपीआई BOOL को परिभाषित करेगा। इसके अलावा, कोई भी यह नहीं बता रहा है कि BOOL को कैसे परिभाषित किया जाता है, कुछ अनुप्रयोग इसे एक बिट लंबे क्षेत्र के रूप में परिभाषित कर सकते हैं। आप यह नहीं मान सकते कि यह हमेशा इंट के बराबर है क्योंकि कुछ विशिष्ट पुस्तकालय इसे इस तरह परिभाषित करते हैं।

1
+1। शायद वह वास्तव में BOOL का मतलब था और न कि बूल का। शायद BOOL को संभवतः अलग-अलग तरीकों से लागू किया जा सकता है, हालांकि कोडरव्यू संभावना नहीं जानता है कि अगर वह इस तरह का सवाल पूछ रहा है। वह देखता है कि इसे इंट के रूप में परिभाषित किया गया है, इसलिए वह स्वाभाविक रूप से पूछता है कि वह केवल इंट का उपयोग क्यों नहीं कर सकता है।
नील

1
@ लुंडिन: सामान्य अर्थों में आप सही हैं, लेकिन विचार करें कि यह एक ऐसा उत्तर है जो प्रश्न के दायरे के अंदर रह जाता है, जहां ओपी ने BOOL और int तुल्यता के बारे में बात की थी।
एमिलियो गारवगलिया

फिर भी, इरादे को इंगित करने के लिए BOOL या बूल का उपयोग करने का विचार अभी भी लागू होता है।
एंड्रयू टी फिननेल

1
@ ज़र्बा: सच है, लेकिन इसका कारण यह है कि एमएस ने अपने स्वयं के संकलक में बूल को लागू करने का फैसला किया। यह केवल इंटेल प्रोसेसर के लिए काम करने वाले एमएस कंपाइलरों के लिए मान्य है। ध्यान दें कि, इंटेल प्लेटफ़ॉर्म के लिए, 32 बिट्स से छोटे प्रत्येक अभिन्न प्रकार के इनपुट या आउटपुट पर मास्किंग की आवश्यकता होती है। लेकिन चार [] अभी भी उपयोग किया जाता है और जरूरी नहीं कि हमेशा int द्वारा प्रतिस्थापित किया जाता है []
एमिलियो गरवाग्लिया

6

बूल प्रकार Int प्रकार से छोटे होते हैं, इस प्रकार स्मृति में कम कमरे का उपयोग करते हैं। आपके द्वारा / के लिए संकलित किए जा रहे सिस्टम के आधार पर, एक Int 4 - 8 बाइट्स हो सकता है, जबकि एक बूल 1 बाइट है (जैसा कि इस MSDN लेख में देखा जा सकता है )

के पहलुओं में से कुछ के साथ इस युगल KISS और अच्छे प्रोग्राम डिजाइन, और यह स्पष्ट हो जाता है क्यों यह बेहतर एक चर ही कभी 2 मान होगा कि स्टोर करने के लिए एक bool उपयोग करने के लिए है।

एक ऑब्जेक्ट के साथ चीजों को जटिल क्यों करें जो मूल्यों की एक विस्तृत श्रृंखला को स्टोर कर सकते हैं, जब आप सुनिश्चित हैं कि आपको कभी भी 1 से 2 नए मूल्यों को स्टोर करने की आवश्यकता है?

उस सिस्टम में क्या होता है जो एक इंट का उपयोग करता है, अगर आप वहां 75 स्टोर करते हैं? यदि आपने अतिरिक्त सशर्त जोड़े हैं

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

या

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

तब आप इस स्थिति के लिए आच्छादित हो जाते हैं। लेकिन अगर आपने नहीं किया है, तो आप नहीं हैं।

आपके पास एक मामला हो सकता है (आप इंट के मूल्य को कैसे बदल रहे हैं इसके आधार पर) जहां आपके पास एक बफर ओवररन है, और मान "रीसेट" पर वापस 0 या आपके इंट के निचले बाउंड (जो कहीं हो सकता है) -127 से −9,223,372,036,854,775,808 का क्षेत्र, आपकी लक्ष्य वास्तुकला पर निर्भर करता है ) आपके कोड में क्या होता है?

हालाँकि, यदि आप एक बूल का उपयोग करते हैं तो आप कुछ इस तरह से उपयोग कर सकते हैं:

if(continueBool == true)
  return true;
else
  return false;

या और भी:

return (continueBool== true) ? true : false;

या और भी:

return continueBool;

आपके संकलक के आधार पर, ऐसे अनुकूलन हो सकते हैं कि यह कोड पर प्रदर्शन कर सकता है जो मैप किए गए सच्चे / झूठे मूल्यों को संग्रहीत करने के लिए बूल का उपयोग करता है। हालांकि, ऐसी आशाएँ नहीं हो सकती हैं, जो मैप किए गए इनट्स को सही / गलत मान रखने के लिए इस्तेमाल किया जा सकता है।

हमें यह भी याद है कि C ++ (C, असेंबली और FORTRAN के साथ) का उपयोग अत्यधिक कुशल, छोटे और तेज़ कोड लिखने के लिए किया जाता है। इसलिए, इस उदाहरण में एक बूल का उपयोग करना बेहतर होगा - खासकर यदि आपको चर, मेमोरी, कैश या प्रोसेसर समय के अपने उपयोग पर चिह्नित किया जा रहा है।

एक समान प्रश्न यह होगा: मैं एक फ्लोट में पूर्णांक (मान) को क्यों संग्रहीत करूंगा? उत्तर: आपको ऐसा नहीं करना चाहिए, क्योंकि कोई बात नहीं है।

लंबी कहानी छोटी: जैसा कि आपके शिक्षक (ट्यूटर / लेक्चरर / प्रोफेसर आपके साथ विभिन्न मूल्य प्रकारों के आकार में जाने के लिए (यदि आपने इसे मिस किया है), और वे सॉफ्टवेयर डेवलपमेंट में महत्वपूर्ण क्यों हैं।

मुझे उम्मीद है कि शुरुआती बिंदु के रूप में मदद मिलेगी (मुझे यह भी उम्मीद है कि यह पांडित्य के रूप में सामने नहीं आता है)


4
यदि () पुरस्कार का अनावश्यक उपयोग नहीं किया गया। बस return value >= 0;पहले उदाहरण के लिए लिखें ।
zvrba

मुझे वाक्य रचना की ओपी की समझ के स्तर पर यकीन नहीं था। कभी-कभी यह सामान्य से थोड़ी अधिक क्रिया होने के लिए पुरस्कृत होता है - खासकर जब से ओपी ने उल्लेख किया कि यह एक असाइनमेंट था
जेमी टेलर

2
असहमत होने के लिए नहीं - लेकिन सिर्फ यह बताने के लिए कि एक इंट में एक बूल का चयन करके तीन बाइट्स को बचाने से अधिकांश कार्यक्रमों पर कोई ध्यान देने योग्य अंतर नहीं होगा। दक्षता के बारे में चिंता न करें जब तक आपको वास्तव में प्रदर्शन की समस्या न हो!
जेम्स एंडरसन

@ नाम: कई मामलों में भी आप तीन बाइट्स नहीं बचाएंगे क्योंकि अगला चर, जब तक कि यह एक और बूल या चार नहीं है, संभवतः चार बाइट की सीमा के साथ जुड़ जाएगा।
जेरेमीपीप

1

यहाँ उद्देश्य इरादे की स्पष्टता है। वापसी प्रकार एक फ़ंक्शन इंटरफ़ेस का हिस्सा है और boolआपको फ़ंक्शन की अपेक्षा फ़ंक्शन के बारे में अधिक बताता हैint करता है है।

यहां तक BOOLकि अधिक अभिव्यंजक है int, भले ही यह एक ही प्रकार है यह कम से कम आपके इरादे को दर्शाता है।

हालांकि, उनमें से कोई भी ऐसा नहीं है जिसे मैं सुझाऊंगा:

enum class UiCmd {QUIT, START_GAME};

-1

प्रोग्रामिंग में आप कोड में वास्तविक जीवन से कुछ का प्रतिनिधित्व करना चाहते हैं। एक इंट और बूल एक ही करने के बावजूद, सबसेंटेंट विचार पूरी तरह से अलग है: बूल का उपयोग करते समय उत्तर हां या नहीं हो सकता है; और यही सब है, यही आशय है। पूर्णांक के साथ आप दशमलव बिंदु के बिना मात्रा का प्रतिनिधित्व कर सकते हैं । और उसी भावना में, आप एक पूर्णांक का चयन क्यों करेंगे जब एक डबल वही कर सकता है? यदि कोई पूर्णांक समस्या की मॉडलिंग करते समय दोहरे से अधिक समझ में आता है, तो आप एक इंट का चयन कर सकते हैं।


1
इससे बने बिंदुओं पर पर्याप्त मात्रा में कुछ भी नहीं लगता है और शीर्ष उत्तर में बताया गया है जो लगभग 6 साल पहले पोस्ट किया गया था
gnat

-2

क्योंकि अंत में, आप किसी भी तरह अपने पूर्णांक को बूलियन में बदलने जा रहे हैं: "यदि (i = 1) तो दूसरा गेम खेलें"। इस स्थिति में (i = 1) सही या गलत: एक बूलियन में बदल जाता है।


बहुत निर्भर करता है कि आप किस मशीन पर चल रहे हैं और संकलक शामिल हैं। आप आईबीएम मेनफ्रेम की तुलना में यह जानकर आश्चर्यचकित हो सकते हैं कि "Y" या "N" वाला एकल चरित्र ध्वज बूलियन तर्क को लागू करने का सबसे कारगर तरीका है।
जेम्स एंडरसन

4
ध्यान दें, if (i = 1)शायद किसी के कोड में बहुत गलत बात है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.