সি ++ এ কখন আপনাকে বুল ব্যবহার করা উচিত?


34

আমাদের ক্লাসের জন্য একটি অ্যাসাইনমেন্ট ছিল যেখানে আমাদের একটি তৈরি করতে হয়েছিল টিক-ট্যাক-টো গেম তৈরি করতে হয়েছিল। লোকেরা নিজেকে জটিল করতে পছন্দ করে, তাই তারা জটিল গেমগুলি লিখেছিল যার মেনুগুলি অন্তর্ভুক্ত ছিল। গেমের শেষে, আপনাকে আবার খেলতে বা প্রোগ্রামটি ছেড়ে দেওয়ার বিকল্প থাকতে হবে। আমি তারintজন্যএকটিপরিবর্তনশীল ব্যবহার করেছি, কিন্তু আমি কিছু সহপাঠী বিওএল ব্যবহার করে লক্ষ্য করেছি।

এটা আরও দক্ষ? পার্থক্য কী, কোনও উত্তর সংরক্ষণ করার মধ্যে যা কেবলমাত্র একটিতে দুটি মান সংরক্ষণ করা উচিতint তা কেবল একটি বুলিতে সংরক্ষণের পরিবর্তে হবে? এই পরিবর্তনশীলগুলির সঠিক উদ্দেশ্য কী?


32
দক্ষতা সম্পর্কে নিশ্চিত নয়, তবে একটির উদ্দেশ্য intহ'ল একটি পূর্ণসংখ্যা সংরক্ষণ করা এবং এর উদ্দেশ্য boolহ'ল বুলিয়ান মান ( trueবা false) সঞ্চয় করা। একটি boolআইএমও ব্যবহার করা এর ব্যবহারের চেয়ে একটি ভাল ব্যবহার প্রতিফলিত করে int
জর্জ ডেকেট

12
আসলে, সি ++ এবং সি 99 এর আগে সি 89 এর মধ্যে বুলিয়ান টাইপ ছিল না। প্রোগ্রামাররা প্রায়শই typedef int Boolএটি পরিষ্কার করার জন্য যে তারা একটি বুলিয়ান ব্যবহার করছে। boolভাষার পরিবর্তে সি ++ ইন্টিগ্রেটেড সমর্থন , যেমন (99 টির পরিবর্তে) কীবোর্ডের সাহায্যে 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 টি। এটি উদ্দেশ্য / বিকল্পগুলি পরিষ্কার করে। "হ্যাঁ" বা "না" মান সহ একটি স্ট্রিং সহ মান সংরক্ষণ করতে আপনি যে কোনও পদ্ধতি ব্যবহার করতে পারেন তবে আপনি যেটিকে সবচেয়ে বেশি বোধগম্য তা চয়ন করুন। এই ক্ষেত্রে, এটি একটি বুলিয়ান।
ক্রেইজ

আমি ভেবেছিলাম সি ++ তে বুলিয়ানগুলি আকার, 4 বাইট হিসাবে একই আকারের ছিল।
ডগডোগ

53

এটি সমস্ত (এখন অবধি) সংগৃহীত উত্তরগুলিতে মনে হয় যে কেউ ওপি এই বিষয়ে কথা বলেছে BOOLতা সত্যই ধরা পড়েনি bool

যেহেতু প্রশ্নটি সি ++ ট্যাগ করা হয়েছে, এটি অবশ্যই লক্ষ করা উচিত:

  • intএকটি পূর্ণসংখ্যা যে থেকে রেঞ্জ হল INT_MINথেকে INT_MAXম্যাক্রো সংজ্ঞায়িত - <climits>যার মান হোস্টিং মেশিনের আর্কিটেকচার উপর নির্ভর। সি ++ এ এই মানগুলি যথাক্রমে 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 এবং false0 হয়।

গুরুত্বপূর্ণ দিকটি হ'ল এটি প্রোগ্রামিং ভুলগুলির বিরুদ্ধে বেশি নিরাপদ:

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 সি ++ বা সি ভাষার অংশ নয়। বড় আকারের অক্ষরগুলি সহ BOOL সর্বাধিক প্রচলিত উপায় হ'ল পুরানো দিনগুলিতে, যখন সি এর কোনও বুলিয়ান প্রকার ছিল না। উদাহরণস্বরূপ, উইন্ডোজ এপিআইও বিওএল সংজ্ঞায়িত করবে। আরও, বিওএলকে কীভাবে সংজ্ঞায়িত করা হয় তা বলার অপেক্ষা রাখে না, কিছু অ্যাপ্লিকেশন এটিকে কিছুটা দীর্ঘ বিট-ফিল্ড হিসাবে সংজ্ঞায়িত করতে পারে। আপনি ধরে নিতে পারবেন না যে এটি সর্বদা ইন্টের সমান হয় কারণ কিছু নির্দিষ্ট গ্রন্থাগার এটি সেভাবে সংজ্ঞায়িত করে।

1
+1 টি। সম্ভবত তিনি আসলে করেনি গড় bool এবং bool,। সম্ভবত বিওএল সম্ভাব্য বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে, যদিও কোডরিভিউ সম্ভবত জানেন না যে তিনি যদি এই ধরণের প্রশ্ন জিজ্ঞাসা করছেন। তিনি দেখেন যে এটি একটি অন্তর্নিহিত হিসাবে সংজ্ঞায়িত হয়েছে, তাই তিনি স্বাভাবিকভাবেই জিজ্ঞাসা করেন যে তিনি কেবল ইনট ব্যবহার করতে পারবেন না।
নীল

1
@ লন্ডিন: সাধারণ অর্থে আপনি সঠিক, তবে বিবেচনা করুন যে এটি এমন একটি উত্তর যা প্রশ্নের ক্ষেত্রের ভিতরে চলে যায়, যেখানে ওপি বিওএল এবং সমতা সমতা সম্পর্কে কথা বলেছিল।
এমিলিও গারাভাগলিয়া

তবুও, উদ্দেশ্যটি বোঝাতে BOOL বা bool ব্যবহারের ধারণাটি এখনও প্রযোজ্য।
অ্যান্ড্রু টি ফিনেল

1
@ জভ্রবা: সত্য, তবে এটি এমএস তার নিজস্ব সংকলকগুলিতে বুল প্রয়োগের সিদ্ধান্ত নিয়েছে। এটি কেবলমাত্র এমএস কম্পাইলারদের জন্য যা ইন্টেল প্রসেসরের জন্য কাজ করে তা বৈধ। নোট করুন, ইন্টেল প্ল্যাটফর্মের জন্য, 32 বিটের চেয়ে কম প্রতিটি অবিচ্ছেদ্য টাইপের জন্য ইনপুট বা আউটপুটটিতে একটি মাস্কিং প্রয়োজন। তবে চর [] এখনও ব্যবহৃত হয় এবং অগত্যা সবসময় ইনট দ্বারা প্রতিস্থাপন করা হয় না
এমিলিও গারাভাগলিয়া

6

বুলের প্রকারগুলি ইন্টার টাইপের চেয়ে ছোট, সুতরাং মেমরিতে কম ঘর ব্যবহার করে। আপনি যে সিস্টেমটি / এর জন্য সংকলন করছেন তার উপর নির্ভর করে একটি ইনট 4 - 8 বাইট হতে পারে, যেখানে একটি বুল 1 বাইট হয় ( এই এমএসডিএন নিবন্ধে দেখা যাবে )

এটি কেআইএসএস এবং ভাল প্রোগ্রাম ডিজাইনের কয়েকটি দিকের সাথে জুড়ুন এবং এটি স্পষ্ট হয়ে ওঠে যে কেন একটি ভেরিয়েবল সংরক্ষণ করার জন্য একটি বুল ব্যবহার করা ভাল যেখানে কেবলমাত্র 2 টি মান থাকবে।

আপনি যখন কেবলমাত্র 2 টির মধ্যে 1 টি পৃথক মান সংরক্ষণের প্রয়োজন তা নিশ্চিত হয়ে ওঠেন এমন কোনও বস্তুর সাথে কী কী জটিল জিনিসগুলি বিস্তৃত মানগুলিকে সঞ্চয় করতে পারে?

সিস্টেমে কোন ইনট ব্যবহার হয়, যদি আপনি সেখানে 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;

আপনার সংকলকটির উপর নির্ভর করে, অপ্টিমাইজেশন হতে পারে যে এটি কোডের মধ্যে পারফর্ম করতে পারে যা মুলযুক্ত সত্য / মিথ্যা মানগুলিকে সঞ্চয় করতে বুলগুলি ব্যবহার করে। অন্যদিকে, ম্যাপযুক্ত সত্য / মিথ্যা মানগুলি সংরক্ষণ করতে ব্যবহৃত ইনটসের জন্য এটি সম্পাদন করতে পারে এমন অপ্টিমাইজেশন নাও থাকতে পারে।

আমাদের আরও মনে রাখতে হবে যে সি ++ (সি, এসেম্বলি এবং ফোরট্রান সহ) অত্যন্ত দক্ষ, ছোট এবং দ্রুত কোড লিখতে ব্যবহৃত হয়। সুতরাং, এই পরিস্থিতিতে একটি বুল ব্যবহার করা ভাল - বিশেষত যদি আপনার ভেরিয়েবল, মেমরি, ক্যাশে বা প্রসেসরের সময় ব্যবহার করে চিহ্নিত করা হয়।

একই অনুরূপ প্রশ্নটি হবে: কেন আমি একটি ফ্লোটে একটি পূর্ণসংখ্যা (মান) সঞ্চয় করব? উত্তর: আপনার উচিত হবে না, কারণ এর কোনও মানে নেই।

দীর্ঘ গল্প সংক্ষিপ্ত: আপনার শিক্ষক / গৃহশিক্ষক / প্রভাষক / অধ্যাপক হিসাবে আপনার সাথে বিভিন্ন মানের ধরণের আকার দেখতে (যদি আপনি এটি মিস করেন) এবং সফ্টওয়্যার বিকাশে কেন তারা গুরুত্বপূর্ণ।

আমি আশা করি এটি একটি প্রাথমিক পয়েন্ট হিসাবে সহায়তা করবে (আমি এটিও আশা করি এটি পেডেন্টিক হিসাবে আসে না)


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) সত্য বা মিথ্যাতে রূপান্তরিত হয়: একটি বুলিয়ান।


আপনি কোন মেশিনে চালাচ্ছেন এবং সংকলকরা এতে জড়িত তার উপর নির্ভর করে। আইবিএম মেইনফ্রেমেজগুলির চেয়ে আপনি সম্ভবত অবাক হতে পারেন, "ওয়াই" বা "এন" দিয়ে একটি একক চরিত্রের পতাকাটি বুলিয়ান যুক্তি প্রয়োগের সবচেয়ে কার্যকর উপায়।
জেমস অ্যান্ডারসন

4
মনে রাখবেন, কারও কোডে if (i = 1)থাকা খুব ভুল জিনিস।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.