সি তে বুলিয়ান মান ব্যবহার করে


701

সি-তে কোনও বিল্ট-ইন বুলেটিয়ান প্রকার নেই। এগুলিকে সি-তে ব্যবহার করার সর্বোত্তম উপায় কী?


73
সিতে বুলিয়ান টাইপ রয়েছে। কমপক্ষে সাম্প্রতিকতম মানগুলির মধ্যে একটি রয়েছে।
আরাক

উত্তর:


1047

সেরা থেকে আরও খারাপ:

বিকল্প 1 (সি 99)

#include <stdbool.h>

বিকল্প 2

typedef enum { false, true } bool;

বিকল্প 3

typedef int bool;
enum { false, true };

বিকল্প 4

typedef int bool;
#define true 1
#define false 0

ব্যাখ্যা

  • আপনি সি 99 ব্যবহার করলেই বিকল্পটি 1 কাজ করবে এবং এটি করার জন্য এটি "আদর্শ উপায়"। সম্ভব হলে এটি চয়ন করুন।
  • বিকল্প 2, 3 এবং 4 টি একই ধরণের আচরণে অনুশীলনে থাকবে। # 2 এবং # 3 যদিও # সংজ্ঞা ব্যবহার করবেন না, যা আমার মতে ভাল।

আপনি যদি সিদ্ধান্তহীন হন তবে # 1 নিয়ে যান!


1
কেন তারা সবচেয়ে খারাপ বিকল্পের মধ্যে সেরা তা আপনি বিশদ বর্ণনা করতে পারেন ?
এন্ডোলিথ

1
@ এন্ডোলিথ সংকলনটি চয়ন করে প্রান্তিককরণ, অনুকূলকরণ এবং উপায়টি <stdbool.h> boolবুলিয়ান মানের উদ্দেশ্যে ব্যবহারের চেয়ে বেশি উপযুক্ত হতে পারে int(অর্থাত সংকলক এটির boolচেয়ে আলাদাভাবে প্রয়োগ করতে পারে int)। আপনি ভাগ্যবান হলে এটি সংকলনের সময় কঠোর প্রকারের চেকিংয়েরও ফলস্বরূপ।
blubberdiblub

1
কেন ব্যবহার intকরবেন bool? এটা অপব্যয়। ব্যবহার unsigned char। অথবা সি এর বিল্টিন ব্যবহার করুন _Bool
দেহ নেই

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

240

সি তে বুলিয়ান সম্পর্কে কয়েকটি চিন্তাভাবনা:

আমি যথেষ্ট বয়স্ক যে আমি intটাইপেফস বা সত্য / মিথ্যা মানগুলির জন্য বিশেষ সংজ্ঞায়িত বা এনামগুলিকে ছাড়াই কেবল আমার বুলিয়ান প্রকার হিসাবে প্লেইন এস ব্যবহার করি । আপনি বুলিয়ান ধ্রুবকগুলির সাথে তুলনা না করার বিষয়ে নীচে আমার পরামর্শটি যদি অনুসরণ করেন তবে আপনি যেভাবেই পতাকাগুলি শুরু করতে কেবল 0/1 ব্যবহার করতে হবে। যাইহোক, এই জাতীয় পদ্ধতির এই আধুনিক সময়ে খুব প্রতিক্রিয়াশীল বলে মনে করা যেতে পারে। <stdbool.h>সেক্ষেত্রে অবশ্যই একটি ব্যবহার করা উচিত কারণ এটির অন্তত মানক হওয়ার সুবিধা রয়েছে।

বুলিয়ান ধ্রুবকদের যাই বলা হোক না কেন সেগুলি কেবল আরম্ভের জন্য ব্যবহার করুন। কখনও কখনও কিছু লিখুন না

if (ready == TRUE) ...
while (empty == FALSE) ...

এগুলি সর্বদা ক্লিয়ারার দ্বারা প্রতিস্থাপিত হতে পারে

if (ready) ...
while (!empty) ...

মনে রাখবেন যে এগুলি যথাযথভাবে এবং বোধগম্যভাবে উচ্চস্বরে পড়া যেতে পারে।

আপনার বুলিয়ান ভেরিয়েবল ইতিবাচক নাম, অর্থাত দাও fullপরিবর্তে notfull। পরবর্তীটি এমন কোডের দিকে নিয়ে যায় যা সহজেই পড়া সহজ। তুলনা করা

if (full) ...
if (!full) ...

সঙ্গে

if (!notfull) ...
if (notfull) ...

প্রাক্তন জুটি উভয়ই প্রাকৃতিকভাবে পড়েন, যদিও !notfullএটি পড়ার মতো বিশ্রী হয় এবং আরও জটিল বুলিয়ান অভিব্যক্তিতে আরও খারাপ হয়ে যায়।

বুলিয়ান যুক্তিগুলি সাধারণত এড়ানো উচিত। এই মত সংজ্ঞায়িত একটি ফাংশন বিবেচনা করুন

void foo(bool option) { ... }

ফাংশনের মূল অংশের মধ্যে এটি যুক্তিটির অর্থ কী তা খুব স্পষ্ট যেহেতু এটির একটি সুবিধাজনক এবং আশাবাদী অর্থপূর্ণ নাম রয়েছে। তবে, কল সাইটগুলি দেখতে দুর্দান্ত

foo(TRUE);
foo(FALSE):

এখানে, প্যারামিটারটি ফাংশন সংজ্ঞা বা ঘোষণাপত্রটি সর্বদা না তাকানো বলতে কী বোঝায় তা মূলত অসম্ভব এবং যদি আপনি আরও বুলিয়ান প্যারামিটার যুক্ত করেন তবে তা আরও খারাপ হয়ে যায়। আমি প্রস্তাব করছি

typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);

অথবা

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

উভয় ক্ষেত্রেই, কল সাইটটি এখন দেখে মনে হচ্ছে

foo(OPT_ON);
foo(OPT_OFF);

যার সংজ্ঞাটি ড্রেজিং না করে পাঠকের কমপক্ষে বোঝার সুযোগ রয়েছে foo


1
এবং সাম্যের জন্য আপনি দুটি পরিবর্তনশীল কীভাবে তুলনা করবেন? বুলিয়ান ধ্রুবক ব্যবহার কখনও দুর্দান্ত কাজ করে না, তবে অ-ধ্রুবকের সাথে তুলনা করার সময় সমস্যাটি সমাধান হয় না।
বারুচ

আমাকে ক্ষমা করুন, কিন্তু আমি প্রশ্নটি বুঝতে পারি না। আপনি কি জিজ্ঞাসা করছেন যে সাম্যের জন্য আমি কীভাবে দুটি বুলিয়ান ভেরিয়েবলের তুলনা করব? যদি তাই হয়, a == bকাজ করে না ?
ডেল হ্যাগলুন্ড

5
@ কেনজি আপনি যা বলছেন তা সত্য, যদিও আমি বিশ্বাস করি যে সত্যের সমতুল্য হিসাবে এক ব্যতীত অন্য মানগুলি ব্যবহার করা প্রায়শই একটি খারাপ ধারণা। আপনার উদাহরণে সুতরাং, অভিমানী যে aএবং bশূন্য থেকে আপ গণনা, আমি বলতে চাই a > 0 == b > 0পরিবর্তে। আপনি যদি নির্বিচারে অ-শূন্য মানগুলির সত্যতার সদ্ব্যবহারের জন্য জোর দিয়ে থাকেন, তবে !!varবুলিয়ান 0/1 মানের সমান ফলস্বরূপ var, আপনি লিখতে পারেন !!a == !!b, যদিও বেশ কিছু পাঠকই এটি বিভ্রান্তিকর বলে মনে করতে পারেন।
ডেল হ্যাগলুন্ড

3
!a == !bসমতা পরীক্ষার জন্যও যথেষ্ট, নন-জিরো শূন্য হয় এবং শূন্যগুলি এক হয়ে যায়।
রায়ানপ্যাটিসন

5
@ আরপ্যাটিসো অবশ্যই আপনি ঠিক বলেছেন, তবে আমি অনুমান করি যে আমি !!a"নন-বুলিয়ান এটিকে তার সমপর্যায়ের মান হিসাবে রূপান্তর করব" হিসাবে পড়ব , যেখানে আমি !a"যৌক্তিকভাবে বুলিয়ান ভেরিয়েবল এ রূপান্তরিত করব" বলে পড়তাম । বিশেষত, আমি যৌক্তিক বিপর্যয়টি কাঙ্ক্ষিত হওয়ার জন্য নির্দিষ্ট কোনও কারণ অনুসন্ধান করতাম।
ডেল হ্যাগলুন্ড

88

সি-তে একটি বুলিয়ান একটি পূর্ণসংখ্যা: মিথ্যাটির জন্য শূন্য এবং সত্যের জন্য শূন্য নয়।

আরও দেখুন বুলিয়ান ডাটা টাইপ , বিভাগ সি, সি ++ উদ্দেশ্য সি, awk


এটি লজিকাল অপারেটরগুলির সাথেও খুব ভাল কাজ করে (&& এবং ||)।
জুল্ট

74

আমি যে সংস্করণটি ব্যবহার করেছি তা এখানে:

typedef enum { false = 0, true = !false } bool;

কারণ মিথ্যাটির কেবল একটি মান রয়েছে তবে একটি যৌক্তিক সত্যের অনেকগুলি মান থাকতে পারে তবে কৌশলটি সত্যটি সেট করে যে সংকলকটি মিথ্যা বিপরীতে ব্যবহার করবে।

এটি কারও কাছে কোডিং করার সমস্যাটির যত্ন নেয় যা এখানে নেমে আসবে:

if (true == !false)

আমি মনে করি আমরা সকলেই সম্মতি জানাব যে এটি একটি ভাল অনুশীলন নয়, তবে "সত্য =! মিথ্যা" করার এক সময়ের ব্যয় আমরা সেই সমস্যাটি দূর করি।

[সম্পাদনা] শেষ পর্যন্ত আমি ব্যবহার করেছি:

typedef enum { myfalse = 0, mytrue = !myfalse } mybool;

সংজ্ঞায়িত করা trueএবং অন্যান্য স্কিমগুলির সাথে নামের সংঘাত এড়াতে false। তবে ধারণাটি একই রয়েছে।

[সম্পাদনা] বুলিয়ানতে পূর্ণসংখ্যার রূপান্তর দেখাতে:

mybool somebool;
int someint = 5;
somebool = !!someint;

প্রথম (ডানদিকে)! অ-শূন্য পূর্ণসংখ্যাকে 0 এ রূপান্তর করে, তারপরে দ্বিতীয় (সর্বাধিক বাম)! 0 কে একটি myfalseমান রূপান্তর করে । আমি এটিকে পাঠকের শূন্য পূর্ণসংখ্যার রূপান্তর করার জন্য অনুশীলন হিসাবে ছেড়ে দেব।

[সম্পাদনা] ডিফল্ট মানটি একই রকম হয় এমনকি যদি নির্দিষ্ট মান প্রয়োজন হয় তবে এনামে একটি মানের সুস্পষ্ট সেটিংস ব্যবহার করা আমার স্টাইল। উদাহরণ: কারণ মিথ্যাটি শূন্য হওয়া দরকার false = 0,বরং আমি ব্যবহার করিfalse,


5
এছাড়াও enums ব্যবহার করে অন্য একটি বেনিফিট আইডিই ইন্টিগ্রেশন হয় - true, falseএবং boolহাইলাইট করা হয় সবচেয়ে আইডিই কারণ তারা enum মূল্যবোধ ও একটি typedef, যেমন উল্টোদিকে হয় #defines, যা খুব কমই সিনট্যাক্স হাইলাইট করা হয়।

কৌতূহলী: এটি আসলে কাজ করে কি না তা উপেক্ষা করে, কোনও এনামকে একই গণনাতে পূর্বের মান উল্লেখ করার অনুমতি দেওয়া কি বৈধ সি (99+) ?

@ tgm1024 gcc -ansi -pedantic -Wallকোনও সতর্কতা দেয় না, তাই আমি বিশ্বাস করি gcc; c89এটি এমনকি যদি এটি কাজ করে তবে পাশাপাশি কাজ করা উচিত c99
yyny

1
"যেহেতু মিথ্যাটির কেবল একটি মান থাকে তবে একটি যৌক্তিক সত্যের অনেকগুলি মান থাকতে পারে তবে প্রযুক্তিটি সত্যটি সেট করে যে সংকলকটি মিথ্যা বিপরীতে ব্যবহার করবে।" নেগেশন অপারেটর !কেবল মানগুলি ফিরিয়ে দিতে পারে 0এবং 1তাই true = !falseসর্বদা মান 1 প্রদান করবে This এই পদ্ধতিটি কোনও অতিরিক্ত সুরক্ষা দেয় না typedef enum { false, true } bool;
ব্যবহারকারী 694733

1
প্রথম পাওয়া আমি C90 থেকে পেয়েছি (6.3.3.3 ইউনিারি পাটিগণিত অপারেটর): "লজিকাল নেগেটিশন অপারেটরের ফলাফল 0 হয় যদি এর অপারেন্ডের মান 0 টির সাথে তুলনা করে যদি এর অপারেন্ডের মান 0 এর সমান হয়। ফলাফলের প্রকারটি অন্তর্ভুক্ত থাকে The অভিব্যক্তি! ই সমান (O == E) " এটি যে কোনও সংকলককে কখনও স্ট্যান্ডার্ড সি সমর্থন করার দাবি করেছে তা অবশ্যই আবশ্যক। কমপাইলাররা অবশ্যই পর্যবেক্ষণযোগ্য আচরণের মতো (যেমন if(!value)) এর ক্ষেত্রে গুরুত্বপূর্ণ নয় এমন ক্ষেত্রে এই নিয়মটিকে আইনত অবহেলা করতে পারে তবে এই ব্যতিক্রমটি এই নির্দিষ্ট ক্ষেত্রে প্রযোজ্য নয়।
ব্যবহারকারী 694733


30

আগেরটা আগে. সি, অর্থাৎ আইএসও / আইইসি 9899 এর এখন 19 বছর ধরে বুলিয়ান টাইপ রয়েছে । এই প্রশ্নটি দেখার সময় মিলিত হয়ে অপেশাদার / একাডেমিক / পেশাদার অংশগুলির সাথে সি প্রোগ্রামিং ক্যারিয়ারের প্রত্যাশিত দৈর্ঘ্যের চেয়ে বেশ দীর্ঘ সময় । আমার সম্ভবত এটি 1-2 বছর পেরিয়ে গেছে। এর অর্থ হ'ল যে সময়কালে একজন গড় পাঠক সি সম্পর্কে মোটেও কিছু শিখেছে, সি আসলে বুলিয়ান ডেটা টাইপ ছিল

ডেটাটাইপ, #include <stdbool.h>এবং ব্যবহারের জন্য true, falseএবং bool। অথবা এটা, এবং ব্যবহার অন্তর্ভুক্ত করবেন না _Bool, 1এবং 0পরিবর্তে।


এই থ্রেডের অন্যান্য উত্তরগুলিতে প্রচারিত বিভিন্ন বিপজ্জনক অনুশীলন রয়েছে। আমি তাদের সম্বোধন করব:

typedef int bool;
#define true 1
#define false 0

এটি হ'ল না, কারণ একজন নৈমিত্তিক পাঠক - যারা ১৯ বছরের মধ্যে সি শিখেছে - তারা আশা করবে যে boolএটি প্রকৃত bool ডেটা টাইপকে বোঝায় এবং একইরকম আচরণ করবে, তবে তা হয় না! উদাহরণ স্বরূপ

double a = ...;
bool b = a;

C99 bool/ এর সাথে _Bool, iff শূন্য এবং অন্যথায় bসেট করা হবে। সি 11 6.3.1.2 পি 1false atrue

  1. যখন কোনও স্কেলারের মান রূপান্তরিত হয় _Bool, তখন মানটি 0 টির সাথে তুলনা করলে ফলাফল 0 হয়; অন্যথায়, ফলাফল 1. 59)

পাদটিকা

59) NaN গুলি 0 এর সমান তুলনা করে না এবং এভাবে 1 তে রূপান্তর করে।

সঙ্গে typedefস্থানে, doubleএকটি করতে বাধ্য করা হবে int- যদি ডবল মান সীমার মধ্যে কাজ নয় int, আচরণ অনির্দিষ্ট হয়

প্রাকৃতিকভাবে একই ক্ষেত্রে প্রযোজ্য হয় trueএবং falseএটি একটিতে ঘোষিত হয়েছিল enum

এর চেয়েও মারাত্মক বিষয়টি হ'ল ঘোষণা করা

typedef enum bool {
    false, true
} bool;

কারণ এখন 1 এবং 0 এর সাথে সমস্ত মানগুলি অবৈধ, এবং যদি এই ধরণের কোনও ভেরিয়েবলকে এই জাতীয় মান নির্ধারণ করা হয়, তবে আচরণটি পুরোপুরি অপরিজ্ঞাত

অতএব যদি আপনি কিছু অনিচ্ছুক কারণে সি 99 ব্যবহার করতে না পারেন তবে বুলিয়ান ভেরিয়েবলের জন্য আপনার ব্যবহার করা উচিত:

  • টাইপ intএবং মান 0এবং 1 হিসাবে হয় ; এবং সাবধানতার সাথে ডাবল অস্বীকৃতি সহ অন্য কোনও মান থেকে ডোমেন রূপান্তরগুলি করুন!!
  • অথবা আপনি যদি জিদ তোমার মনে করি না যে 0, falsy এবং অ শূন্য truish সবচেয়ে ছোট ব্যবহার এ বড় হাতের অক্ষরে যাতে তারা C99 ধারণার সঙ্গে গুলিয়ে ফেলা পেতে পারি: BOOL, TRUEএবং FALSE!

1
সি স্ট্যান্ডার্ডের কোন অংশটি গণ্য প্রকারের অবজেক্টগুলিকে সুনির্দিষ্টভাবে তালিকাভুক্ত মানগুলিতে সীমাবদ্ধ করবে? যদি একটি গণনা করা ধ্রুবকের বৃহত্তম মান UCHAR_MAX বা USHRT_MAX এর চেয়ে কম হয় তবে একটি বাস্তবায়ন একটি অঙ্কের চেয়ে ছোট intবা অন্য ধরণের ব্যবহার করতে পারে unsigned intতবে আমি স্ট্যান্ডার্ডের এমন কিছুই জানি না যা একটি অঙ্ককে পূর্ণসংখ্যা ব্যতীত অন্য কিছু হিসাবে আচরণ করবে to টাইপ করুন।
সুপারক্যাট

18
typedef enum {
    false = 0,
    true
} t_bool;

2
ম্যাক্সএনপিটি-র মাধ্যমে 2 এর সত্যিকারেরও মূল্যায়ন করা উচিত
টেকনোসরাস

2
@ টেকনোসরাস এই পদ্ধতির গ্রহণ করা গ্যারান্টি দেয় না! মিথ্যা == যেহেতু সত্য! মিথ্যা যে কোনও শূন্য নয় নম্বর হতে পারে। একটি সাধারণ কাজের চারপাশে স্পষ্টভাবে সত্য মিথ্যা মিথ্যা করা হবে।
অ্যান্ড্রু

3
@ এন্ড্রু এটি সত্য নয়। !0 = 1সি স্ট্যান্ডার্ড দ্বারা, এবং !a = 0কোনও শূন্য শূন্য মানের জন্য a। সমস্যাটি হ'ল যে কোনও শূন্যকে সত্য হিসাবে বিবেচনা করা হয়। সুতরাং aএবং bযদি উভয়ই "সত্য" হয় তবে অগত্যা এটি isn't a == b` এর ক্ষেত্রে হয় না `
জেরেমি ওয়েস্ট

14

সি এর বুলিয়ান ধরণ রয়েছে: বিল (কমপক্ষে গত 10 (!) বছর ধরে)

Stdbool.h অন্তর্ভুক্ত করুন এবং সত্য / মিথ্যা প্রত্যাশা অনুযায়ী কাজ করবে।


12
10 বছরে স্ট্যান্ডার্ড, তবে 10 বছর নয় কম্পাইলার! এমএসভিসি ++ এর সি সংকলন // কমেন্টের অনুমতি দেওয়ার পরিবর্তে সি 99 কে সমর্থন করে না এবং এমনটি করার সম্ভাবনা কখনও নেই। এছাড়াও _ বিউলটি বিল্ট-ইন টাইপ হিসাবে সি 99 এ সংজ্ঞায়িত করা হয়েছে, যখন বুল <stdbool.h> শিরোনামে টাইপডেফ।
ক্লিফোর্ড

5
আপনার মন্তব্যের 4 বছর পরে ক্লিফোর্ড ... কিছুই পরিবর্তন হয়নি। এমএসভিসি একটি সি ++ সংকলক এবং আমি বিশ্বাস করি এমএস বলেছে যে তারা সমস্ত নতুন সি বৈশিষ্ট্য (সি 99 এবং সি 11) সমর্থন করার জন্য সত্যই আগ্রহী নয়। তবে আমি নিতে পারি না যে এমএসভিসি নতুন সি বৈশিষ্ট্যগুলিকে কারণ হিসাবে সমর্থন করে না (বিশেষত যখন আপনি এটির উত্তর 10 বছরের বিপরীতে করেন )। 10 বছর সত্যিই প্রোগ্রামিং বিশ্বে একটি দীর্ঘ সময়। যে কোনও শালীন সংকলকটির 10 বছরেরও কম সময়ে এর জন্য সমর্থন থাকতে হবে যদি বিক্রেতাকে এটি সমর্থন করার উদ্দেশ্যে করা হয়।
পিপি

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

@ ক্লিফোর্ড: কঠোরভাবে, স্ট্যান্ডার্ডটির boolএকটি ম্যাক্রো হওয়া দরকার যা প্রসারিত হয় _Bool। পার্থক্যটি গুরুত্বপূর্ণ কারণ আপনি #undefম্যাক্রো করতে পারেন (এবং এটি অন্তত একটি ট্রানজিশনাল মেজাজ হিসাবে অনুমোদিত) তবে আপনি untypedefটাইপইফ করতে পারবেন না । যদিও এটি আপনার প্রথম মন্তব্যের মূল জোড় পরিবর্তন করে না।
জোনাথন লেফলার

2
VS2015 এবং পরে (& সম্ভবত আগে, আপ একটি বিন্দু) সঙ্গে কোনো সমস্যা নেই boolমাধ্যমে <stdbool.h>সি সংকলন করেন। এটি সমাধান _Bool

11

বুলিয়ান ক্রিয়াকলাপগুলিতে ননজারো যেকোন কিছুই সত্য হিসাবে মূল্যায়ন করা হয়, তাই আপনি ঠিক পারেন

#define TRUE 1
#define FALSE 0

এবং ধ্রুবক ব্যবহার।


10
তবে সেগুলি যত্ন সহকারে ব্যবহার করুন: যেহেতু সত্য ফলাফল কোনও শূন্য-মান হতে পারে, পরীক্ষাগুলি যদি (t == সত্য) {...} এবং (টি), যা অন্যান্য ভাষায় সমান, সি তে সমান নয় ।
ফোর্টেগা

1
আপনি ঠিক বলেছেন, তবে এটি সি ++ তেও সত্য, যার একটি বুল টাইপ আছে, তাই না? ডিবাগিংয়ের সময় আমি 5837834939 এর মান সহ বুল ভেরিয়েবলগুলি দেখেছি ...
ggambett

1
সি ++ এ, (টি == সত্য) পরীক্ষাটি যদি (টি) পরীক্ষার সমান হয়, কারণ সি ++ কিছু রূপান্তর করে (যা 0 বা একটি নাল পয়েন্টার মানটি সত্যে রূপান্তরিত হয় না)
ফোর্টেগা

6
আপনার বুলিয়ান সত্যিকারের মানটি ধরে নেওয়া উচিত এটি হ'ল শূন্য। সুতরাং (বি) সুরক্ষিত থাকাকালীন কোড (বি == সত্য) না থাকলে; দ্বিতীয়টি খারাপ অভ্যাস (এবং অর্থহীন)।
ক্লিফোর্ড 21

5

যদি আপনাকে সি 99 ব্যবহারের অনুমতি দেওয়া হয় তবে কেবলমাত্র অন্য উত্তরগুলির পরিপূরক এবং কিছু স্পষ্টতার জন্য।

+-------+----------------+-------------------------+--------------------+
|  Name | Characteristic | Dependence in stdbool.h |        Value       |
+-------+----------------+-------------------------+--------------------+
| _Bool |   Native type  |    Don't need header    |                    |
+-------+----------------+-------------------------+--------------------+
|  bool |      Macro     |           Yes           | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
|  true |      Macro     |           Yes           |   Translate to 1   |
+-------+----------------+-------------------------+--------------------+
| false |      Macro     |           Yes           |   Translate to 0   |
+-------+----------------+-------------------------+--------------------+

আমার কিছু পছন্দসমূহ:

  • _Boolবা bool? উভয়ই ভাল, তবে boolকীওয়ার্ডের চেয়ে ভাল দেখাচ্ছে _Bool
  • জন্য গৃহীত মান boolএবং _Boolআছেন: falseবা true। বরাদ্দ করা 0বা 1তার পরিবর্তে falseবা trueবৈধ, তবে যুক্তিপ্রবাহটি পড়া এবং বোঝা আরও শক্ত।

মানক থেকে কিছু তথ্য:

  • _Boolএটি নয় unsigned int, তবে গ্রুপ স্বাক্ষরযুক্ত পূর্ণসংখ্যার অংশ । এটা বড় যথেষ্ট মান রাখা হয় 0বা 1
  • করবেন না, তবে হ্যাঁ, আপনি নতুন সংজ্ঞা দিতে সক্ষম bool trueএবং falseতবে নিশ্চিত যে এটি ভাল ধারণা নয়। এই ক্ষমতা অপ্রচলিত হিসাবে বিবেচিত হয় এবং ভবিষ্যতে সরানো হবে।
  • একটি স্কেলার টাইপ (গাণিতিক ধরণের এবং পয়েন্টার টাইপ) নির্ধারণ করা _Boolবা bool, যদি স্কেলারের মান সমান হয় 0বা এর সাথে তুলনা 0করা হয় 0, অন্যথায় ফলাফল 1: নির্ধারিত হলে _Bool x = 9; 9রূপান্তরিত 1হয় x
  • _Bool1 বাইট (8 বিট) হয়, সাধারণত প্রোগ্রামারটি অন্য বিটগুলি ব্যবহার করার চেষ্টা করতে প্ররোচিত হয়, তবে এটির প্রস্তাব দেওয়া হয় না, কারণ কেবলমাত্র একটি গ্যারান্টি দেওয়া হয় যে কেবলমাত্র একটি বিট ডেটা সংরক্ষণে ব্যবহার করা হয়, char8 এর মতো টাইপের মতো নয় বিট উপলব্ধ।

2

এটি হ'ল:

#define TRUE 1
#define FALSE 0

7
আইডি # নির্ধারিত সত্যের মতো কিছু! মিথ্যা
টম

2

আপনি এটির জন্য একটি চর, বা অন্য একটি ছোট সংখ্যার ধারক ব্যবহার করতে পারেন।

সুডোকোড

#define TRUE  1
#define FALSE 0

char bValue = TRUE;

সি তেও এটি সাধারণত একটি অন্তর্নির্মিত হয় এবং এটি
আন্তঃ

আপনি যদি জায়গার জন্য হ্যান্ড-অপ্টিমাইজ না করেন তবে হার্ডওয়্যারটির সাধারণ শব্দ-আকার (যেমন: সাধারণত একটি int) ব্যবহার করা সর্বদা ভাল , কারণ কিছু আর্কিটেকচারে আপনি এই ভেরিয়েবলগুলিতে প্যাক / মাস্ক চেকগুলি আনপ্যাক না করে একটি কার্যকর পারফরম্যান্স পান।
কিংসলে

2

আপনি _বুল ব্যবহার করতে পারেন, তবে ফেরতের মান অবশ্যই একটি পূর্ণসংখ্যা হতে হবে (সত্যের জন্য 1, ভুজের জন্য 0)। যাইহোক, এটা, যেমন বলেন অন্তর্ভুক্ত করা এবং সি হিসাবে ব্যবহারের bool, ++ পর্যন্ত সুপারিশ করা হচ্ছে এই উত্তর থেকে daniweb ফোরাম , সেইসাথে এই উত্তর , এই অন্যান্য Stackoverflow প্রশ্ন থেকে:

_বুল: সি 99 এর বুলিয়ান টাইপ। _বুলকে সরাসরি ব্যবহারের জন্য কেবলমাত্র আপনি যদি উত্তরাধিকারের কোডটি বজায় রেখে থাকেন যা ইতিমধ্যে মুল, সত্য বা মিথ্যা ম্যাক্রোগুলি সংজ্ঞায়িত করে। অন্যথায়, those ম্যাক্রোগুলি শিরোনামে প্রমিত হয়। সেই শিরোনাম অন্তর্ভুক্ত করুন এবং আপনি বুল যেমন সি ++ তে ব্যবহার করতে পারেন তেমন ব্যবহার করতে পারেন।


2

শর্তসাপেক্ষ এক্সপ্রেশনগুলি সত্য বলে বিবেচিত হয় যদি তা শূন্য হয় তবে সি স্ট্যান্ডার্ডটির জন্য লজিকাল অপারেটররা নিজেরাই 0 বা 1 প্রত্যাবর্তন করে।

@ টম: # সঠিক সত্য! মিথ্যা খারাপ এবং সম্পূর্ণ অর্থহীন। যদি শিরোনামের ফাইলটি সংকলিত সি ++ কোডে প্রবেশ করে তবে সমস্যা হতে পারে:

void foo(bool flag);

...

int flag = TRUE;
foo(flag);

কিছু সংকলক অন্তর্ভুক্ত => বুল রূপান্তর সম্পর্কে একটি সতর্কতা উত্পন্ন করবে। কখনও কখনও লোকেরা এটি করে এড়িয়ে চলে:

foo(flag == TRUE);

অভিব্যক্তিটিকে C ++ বুল হতে বাধ্য করা। তবে আপনি যদি সত্যকে সত্য নির্ধারণ করেন! মিথ্যা, আপনি এটি দিয়ে শেষ করবেন:

foo(flag == !0);

যা কোনও আন্ত-টু-বুল তুলনা করে শেষ করে যা সতর্কতাটিকে যাইহোক ট্রিগার করতে পারে।


1

আপনি যদি C99 ব্যবহার করছেন তবে আপনি _Boolটাইপটি ব্যবহার করতে পারেন । কোন #includeএস প্রয়োজন হয়। আপনার এটি কোনও পূর্ণসংখ্যার মতো চিকিত্সা করা দরকার, তবে কোথায় 1রয়েছে trueএবং 0রয়েছে false

তারপরে আপনি সংজ্ঞায়িত করতে পারেন TRUEএবং FALSE

_Bool this_is_a_Boolean_var = 1;


//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;

অথবা আপনি যা করতে পারেন #include <stdbool.h>এবং ব্যবহার bool, trueএবং falseমান আপনি করতে চায় না।
এসএস আন

1

আজকাল C99 বুলিয়ান প্রকারকে সমর্থন করে তবে আপনার প্রয়োজন #include <stdbool.h>

উদাহরণ:

#include <stdbool.h>

int main() 
{ 
    bool arr[2] = {true, false}; 

    printf("%d\n", arr[0] && arr[1]);
    printf("%d\n", arr[0] || arr[1]);

    return 0; 
} 

আউটপুট:

0
1

0

এটি আমি ব্যবহার করি:

enum {false, true};
typedef _Bool bool;

_Bool এটি সি তে একটি বিল্ট টাইপ যা এটি বুলিয়ান মানগুলির জন্য তৈরি।


-2

আপনি কেবল নীচের মত #defineনির্দেশাবলী ব্যবহার করতে পারেন :

#define TRUE 1
#define FALSE 0
#define NOT(arg) (arg == TRUE)? FALSE : TRUE
typedef int bool;

এবং নিম্নলিখিত হিসাবে ব্যবহার করুন:

bool isVisible = FALSE;
bool isWorking = TRUE;
isVisible = NOT(isVisible);

ইত্যাদি


5
না ম্যাক্রো প্রায় প্রথম বন্ধনী দ্বারা সুরক্ষিত করা উচিত argএবং সামগ্রিকভাবে অভিব্যক্তি: #define NOT(arg) (((arg) == TRUE) ? FALSE : TRUE)। তবে, মিথ্যাচারের জন্য পরীক্ষা করা ভাল হবে (এটি arg0 বা 1 এর পরিবর্তে 23 হলেও সঠিক উত্তর দেবে : #define NOT(arg) (((arg) == FALSE) ? TRUE : FALSE)তবে পুরো প্রকাশটি হ্রাস করা যেতে পারে #define NOT(arg) (!(arg)), অবশ্যই, যা একই ফলাফল দেয়
জোনাথন লেফ্লার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.