সি-তে কোনও বিল্ট-ইন বুলেটিয়ান প্রকার নেই। এগুলিকে সি-তে ব্যবহার করার সর্বোত্তম উপায় কী?
সি-তে কোনও বিল্ট-ইন বুলেটিয়ান প্রকার নেই। এগুলিকে সি-তে ব্যবহার করার সর্বোত্তম উপায় কী?
উত্তর:
সেরা থেকে আরও খারাপ:
বিকল্প 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
আপনি যদি সিদ্ধান্তহীন হন তবে # 1 নিয়ে যান!
<stdbool.h>
bool
বুলিয়ান মানের উদ্দেশ্যে ব্যবহারের চেয়ে বেশি উপযুক্ত হতে পারে int
(অর্থাত সংকলক এটির bool
চেয়ে আলাদাভাবে প্রয়োগ করতে পারে int
)। আপনি ভাগ্যবান হলে এটি সংকলনের সময় কঠোর প্রকারের চেকিংয়েরও ফলস্বরূপ।
int
করবেন bool
? এটা অপব্যয়। ব্যবহার unsigned char
। অথবা সি এর বিল্টিন ব্যবহার করুন _Bool
।
সি তে বুলিয়ান সম্পর্কে কয়েকটি চিন্তাভাবনা:
আমি যথেষ্ট বয়স্ক যে আমি 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
।
a == b
কাজ করে না ?
a
এবং b
শূন্য থেকে আপ গণনা, আমি বলতে চাই a > 0 == b > 0
পরিবর্তে। আপনি যদি নির্বিচারে অ-শূন্য মানগুলির সত্যতার সদ্ব্যবহারের জন্য জোর দিয়ে থাকেন, তবে !!var
বুলিয়ান 0/1 মানের সমান ফলস্বরূপ var
, আপনি লিখতে পারেন !!a == !!b
, যদিও বেশ কিছু পাঠকই এটি বিভ্রান্তিকর বলে মনে করতে পারেন।
!a == !b
সমতা পরীক্ষার জন্যও যথেষ্ট, নন-জিরো শূন্য হয় এবং শূন্যগুলি এক হয়ে যায়।
!!a
"নন-বুলিয়ান এটিকে তার সমপর্যায়ের মান হিসাবে রূপান্তর করব" হিসাবে পড়ব , যেখানে আমি !a
"যৌক্তিকভাবে বুলিয়ান ভেরিয়েবল এ রূপান্তরিত করব" বলে পড়তাম । বিশেষত, আমি যৌক্তিক বিপর্যয়টি কাঙ্ক্ষিত হওয়ার জন্য নির্দিষ্ট কোনও কারণ অনুসন্ধান করতাম।
সি-তে একটি বুলিয়ান একটি পূর্ণসংখ্যা: মিথ্যাটির জন্য শূন্য এবং সত্যের জন্য শূন্য নয়।
আরও দেখুন বুলিয়ান ডাটা টাইপ , বিভাগ সি, সি ++ উদ্দেশ্য সি, awk ।
আমি যে সংস্করণটি ব্যবহার করেছি তা এখানে:
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,
true
, false
এবং bool
হাইলাইট করা হয় সবচেয়ে আইডিই কারণ তারা enum মূল্যবোধ ও একটি typedef, যেমন উল্টোদিকে হয় #defines
, যা খুব কমই সিনট্যাক্স হাইলাইট করা হয়।
gcc -ansi -pedantic -Wall
কোনও সতর্কতা দেয় না, তাই আমি বিশ্বাস করি gcc
; c89
এটি এমনকি যদি এটি কাজ করে তবে পাশাপাশি কাজ করা উচিত c99
।
!
কেবল মানগুলি ফিরিয়ে দিতে পারে 0
এবং 1
তাই true = !false
সর্বদা মান 1 প্রদান করবে This এই পদ্ধতিটি কোনও অতিরিক্ত সুরক্ষা দেয় না typedef enum { false, true } bool;
।
if(!value)
) এর ক্ষেত্রে গুরুত্বপূর্ণ নয় এমন ক্ষেত্রে এই নিয়মটিকে আইনত অবহেলা করতে পারে তবে এই ব্যতিক্রমটি এই নির্দিষ্ট ক্ষেত্রে প্রযোজ্য নয়।
আপনি যদি C99 সংকলক ব্যবহার করছেন তবে এটিতে বিল ধরণের জন্য বিল্ট ইন সমর্থন রয়েছে:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
আগেরটা আগে. সি, অর্থাৎ আইএসও / আইইসি 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
a
true
- যখন কোনও স্কেলারের মান রূপান্তরিত হয়
_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
হিসাবে হয় ; এবং সাবধানতার সাথে ডাবল অস্বীকৃতি সহ অন্য কোনও মান থেকে ডোমেন রূপান্তরগুলি করুন!!
BOOL
, TRUE
এবং FALSE
!int
বা অন্য ধরণের ব্যবহার করতে পারে unsigned int
তবে আমি স্ট্যান্ডার্ডের এমন কিছুই জানি না যা একটি অঙ্ককে পূর্ণসংখ্যা ব্যতীত অন্য কিছু হিসাবে আচরণ করবে to টাইপ করুন।
typedef enum {
false = 0,
true
} t_bool;
!0 = 1
সি স্ট্যান্ডার্ড দ্বারা, এবং !a = 0
কোনও শূন্য শূন্য মানের জন্য a
। সমস্যাটি হ'ল যে কোনও শূন্যকে সত্য হিসাবে বিবেচনা করা হয়। সুতরাং a
এবং b
যদি উভয়ই "সত্য" হয় তবে অগত্যা এটি isn't a == b` এর ক্ষেত্রে হয় না `
সি এর বুলিয়ান ধরণ রয়েছে: বিল (কমপক্ষে গত 10 (!) বছর ধরে)
Stdbool.h অন্তর্ভুক্ত করুন এবং সত্য / মিথ্যা প্রত্যাশা অনুযায়ী কাজ করবে।
bool
একটি ম্যাক্রো হওয়া দরকার যা প্রসারিত হয় _Bool
। পার্থক্যটি গুরুত্বপূর্ণ কারণ আপনি #undef
ম্যাক্রো করতে পারেন (এবং এটি অন্তত একটি ট্রানজিশনাল মেজাজ হিসাবে অনুমোদিত) তবে আপনি untypedef
টাইপইফ করতে পারবেন না । যদিও এটি আপনার প্রথম মন্তব্যের মূল জোড় পরিবর্তন করে না।
বুলিয়ান ক্রিয়াকলাপগুলিতে ননজারো যেকোন কিছুই সত্য হিসাবে মূল্যায়ন করা হয়, তাই আপনি ঠিক পারেন
#define TRUE 1
#define FALSE 0
এবং ধ্রুবক ব্যবহার।
যদি আপনাকে সি 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
।_Bool
1 বাইট (8 বিট) হয়, সাধারণত প্রোগ্রামারটি অন্য বিটগুলি ব্যবহার করার চেষ্টা করতে প্ররোচিত হয়, তবে এটির প্রস্তাব দেওয়া হয় না, কারণ কেবলমাত্র একটি গ্যারান্টি দেওয়া হয় যে কেবলমাত্র একটি বিট ডেটা সংরক্ষণে ব্যবহার করা হয়, char
8 এর মতো টাইপের মতো নয় বিট উপলব্ধ।আপনি এটির জন্য একটি চর, বা অন্য একটি ছোট সংখ্যার ধারক ব্যবহার করতে পারেন।
সুডোকোড
#define TRUE 1
#define FALSE 0
char bValue = TRUE;
int
) ব্যবহার করা সর্বদা ভাল , কারণ কিছু আর্কিটেকচারে আপনি এই ভেরিয়েবলগুলিতে প্যাক / মাস্ক চেকগুলি আনপ্যাক না করে একটি কার্যকর পারফরম্যান্স পান।
আপনি _বুল ব্যবহার করতে পারেন, তবে ফেরতের মান অবশ্যই একটি পূর্ণসংখ্যা হতে হবে (সত্যের জন্য 1, ভুজের জন্য 0)। যাইহোক, এটা, যেমন বলেন অন্তর্ভুক্ত করা এবং সি হিসাবে ব্যবহারের bool, ++ পর্যন্ত সুপারিশ করা হচ্ছে এই উত্তর থেকে daniweb ফোরাম , সেইসাথে এই উত্তর , এই অন্যান্য Stackoverflow প্রশ্ন থেকে:
_বুল: সি 99 এর বুলিয়ান টাইপ। _বুলকে সরাসরি ব্যবহারের জন্য কেবলমাত্র আপনি যদি উত্তরাধিকারের কোডটি বজায় রেখে থাকেন যা ইতিমধ্যে মুল, সত্য বা মিথ্যা ম্যাক্রোগুলি সংজ্ঞায়িত করে। অন্যথায়, those ম্যাক্রোগুলি শিরোনামে প্রমিত হয়। সেই শিরোনাম অন্তর্ভুক্ত করুন এবং আপনি বুল যেমন সি ++ তে ব্যবহার করতে পারেন তেমন ব্যবহার করতে পারেন।
শর্তসাপেক্ষ এক্সপ্রেশনগুলি সত্য বলে বিবেচিত হয় যদি তা শূন্য হয় তবে সি স্ট্যান্ডার্ডটির জন্য লজিকাল অপারেটররা নিজেরাই 0 বা 1 প্রত্যাবর্তন করে।
@ টম: # সঠিক সত্য! মিথ্যা খারাপ এবং সম্পূর্ণ অর্থহীন। যদি শিরোনামের ফাইলটি সংকলিত সি ++ কোডে প্রবেশ করে তবে সমস্যা হতে পারে:
void foo(bool flag);
...
int flag = TRUE;
foo(flag);
কিছু সংকলক অন্তর্ভুক্ত => বুল রূপান্তর সম্পর্কে একটি সতর্কতা উত্পন্ন করবে। কখনও কখনও লোকেরা এটি করে এড়িয়ে চলে:
foo(flag == TRUE);
অভিব্যক্তিটিকে C ++ বুল হতে বাধ্য করা। তবে আপনি যদি সত্যকে সত্য নির্ধারণ করেন! মিথ্যা, আপনি এটি দিয়ে শেষ করবেন:
foo(flag == !0);
যা কোনও আন্ত-টু-বুল তুলনা করে শেষ করে যা সতর্কতাটিকে যাইহোক ট্রিগার করতে পারে।
আপনি যদি 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
মান আপনি করতে চায় না।
আপনি কেবল নীচের মত #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);
ইত্যাদি
arg
এবং সামগ্রিকভাবে অভিব্যক্তি: #define NOT(arg) (((arg) == TRUE) ? FALSE : TRUE)
। তবে, মিথ্যাচারের জন্য পরীক্ষা করা ভাল হবে (এটি arg
0 বা 1 এর পরিবর্তে 23 হলেও সঠিক উত্তর দেবে : #define NOT(arg) (((arg) == FALSE) ? TRUE : FALSE)
তবে পুরো প্রকাশটি হ্রাস করা যেতে পারে #define NOT(arg) (!(arg))
, অবশ্যই, যা একই ফলাফল দেয়