আমি সি তে সংজ্ঞা দেখেছি
#define TRUE (1==1)
#define FALSE (!TRUE)
এটি কি প্রয়োজনীয়? সত্যকে কেবল 1 হিসাবে এবং FALSE কে 0 হিসাবে সংজ্ঞায়িত করার সুবিধা কী?
আমি সি তে সংজ্ঞা দেখেছি
#define TRUE (1==1)
#define FALSE (!TRUE)
এটি কি প্রয়োজনীয়? সত্যকে কেবল 1 হিসাবে এবং FALSE কে 0 হিসাবে সংজ্ঞায়িত করার সুবিধা কী?
উত্তর:
এই পদ্ধতির প্রকৃত booleanপ্রকারটি ব্যবহার করা হবে (এবং সমাধান করতে trueএবং false) যদি সংকলক সমর্থন করে। (বিশেষত, সি ++)
তবে, সি ++ ব্যবহার হচ্ছে কিনা তা যাচাই করা ভাল ( __cplusplusম্যাক্রোর মাধ্যমে ) এবং প্রকৃতপক্ষে trueএবং ব্যবহার করে false।
একটি সি সংকলনে এটি সমান 0এবং 1।
(দ্রষ্টব্য যে ক্রিয়াকলাপ অপসারণের ফলে ক্রমের ক্রমটি ভেঙে যাবে)
1==1একটি int। ( স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 686877৪০৩/২ দেখুন ।)
booleanটাইপ সহ?
trueবা false।
#define TRUE trueএবং #define FALSE falseযখনই __cplusplusসংজ্ঞায়িত করা হয়।
উত্তরটি বহনযোগ্যতা। এর সাংখ্যিক মান TRUEএবং FALSEগুরুত্বপূর্ণ নয়। কি হল গুরুত্বপূর্ণ মত একটি বিবৃতি যে if (1 < 2)মূল্যায়ণ if (TRUE)মত একটি বিবৃতি if (1 > 2)মূল্যায়ণ if (FALSE)।
এটা ঠিক যে, সি, (1 < 2)মূল্যায়ণ 1এবং (1 > 2)মূল্যায়ন করতে 0, তাই অন্যদের বলেছি, কোন ব্যবহারিক পার্থক্য যতটা কম্পাইলার সংশ্লিষ্ট হয় না। তবে সংকলককে সংজ্ঞায়িত করতে TRUEএবং FALSEতার নিজস্ব নিয়ম অনুসারে, আপনি প্রোগ্রামারদের কাছে তাদের অর্থগুলি স্পষ্ট করে দিচ্ছেন, এবং আপনি আপনার প্রোগ্রাম এবং অন্য কোনও লাইব্রেরির মধ্যে ধারাবাহিকতার গ্যারান্টি দিচ্ছেন (অন্য লাইব্রেরি সি মান অনুসরণ করে ধরেছে ... আপনি চাইবেন বিস্মিত).
কিছু ইতিহাস
কিছু বেসিক FALSEযেমন 0এবং TRUEহিসাবে সংজ্ঞায়িত করা হয় -1। অনেক আধুনিক ভাষার মতো তারা কোনও শূন্য-মানকে ব্যাখ্যা করেTRUE তবে তারা বুলিয়ান এক্সপ্রেশনগুলির মূল্যায়ন করে যা সত্য -1। তাদের NOTক্রিয়াকলাপটি 1 যুক্ত করে এবং সাইনটি উল্টে দিয়ে বাস্তবায়িত করা হয়েছিল, কারণ এটি সেভাবে করা দক্ষ ছিল। সুতরাং 'নট এক্স' হয়ে গেল -(x+1)। এর একটি পার্শ্ব প্রতিক্রিয়া হ'ল এটির মতো মূল্য যা 5মূল্যায়ণ করে TRUEতবে NOT 5মূল্যায়নও করে -6যা কোনটি TRUE! এই ধরণের বাগ সন্ধান করা মজাদার নয়।
সর্বোত্তম কার্যাভ্যাস
দেওয়া কার্যত বিধি জারি করে যে শূন্য হিসাবে ব্যাখ্যা করা হয় FALSEএবং কোনো অ-শূন্য মান ব্যাখ্যা করা হয় TRUE, আপনি উচিত করার বুলিয়ান সুদর্শন এক্সপ্রেশন তুলনা কখনোই TRUEবাFALSE । উদাহরণ:
if (thisValue == FALSE) // Don't do this!
if (thatValue == TRUE) // Or this!
if (otherValue != TRUE) // Whatever you do, don't do this!
কেন? কারণ অনেক প্রোগ্রামার intগুলি এস হিসাবে ব্যবহারের শর্টকাট ব্যবহার করে bool। এগুলি এক নয়, তবে সংকলকগণ সাধারণত এটির অনুমতি দেয়। সুতরাং, উদাহরণস্বরূপ, এটি লেখার জন্য পুরোপুরি আইনী
if (strcmp(yourString, myString) == TRUE) // Wrong!!!
এটি বৈধ বলে মনে হচ্ছে এবং সংকলকটি আনন্দের সাথে এটি গ্রহণ করবে, তবে এটি সম্ভবত আপনি যা চান তা তা করে না। যে কারণে ফেরত মান strcmp()হয়
0 যদি yourString == myString
<0 যদি yourString < myString
> 0 হয়yourString > myString
উপরের লাইনটি TRUEকেবল তখনই ফিরে আসে yourString > myString।
এটি করার সঠিক উপায়টি হয়
// Valid, but still treats int as bool.
if (strcmp(yourString, myString))
অথবা
// Better: lingustically clear, compiler will optimize.
if (strcmp(yourString, myString) != 0)
একইভাবে:
if (someBoolValue == FALSE) // Redundant.
if (!someBoolValue) // Better.
return (x > 0) ? TRUE : FALSE; // You're fired.
return (x > 0); // Simpler, clearer, correct.
if (ptr == NULL) // Perfect: compares pointers.
if (!ptr) // Sleazy, but short and valid.
if (ptr == FALSE) // Whatisthisidonteven.
আপনি প্রায়শই উত্পাদনের কোডগুলিতে এই "খারাপ উদাহরণগুলি" খুঁজে পেতে পারেন এবং অনেক অভিজ্ঞ প্রোগ্রামাররা তাদের কসম খায়: তারা কাজ করে, কিছু তাদের (পেডেন্টালি?) সঠিক বিকল্পের চেয়ে ছোট হয় এবং আইডিয়ামগুলি প্রায় সর্বজনীন স্বীকৃত। তবে বিবেচনা করুন: "ডান" সংস্করণগুলি কম দক্ষ নয়, তাদের পোর্টেবল হওয়ার গ্যারান্টি রয়েছে, তারা এমনকি কঠোরতম লাইনারও পাস করবেন এবং এমনকি নতুন প্রোগ্রামারগুলি সেগুলি বুঝতে পারবে।
এটা কি মূল্য নয়?
(1==1)এর চেয়ে বেশি বহনযোগ্য আর কিছু নয় 1। সংকলকের নিজস্ব বিধিগুলি সি ভাষার মতো যা সমতা এবং সম্পর্কিত অপারেটরগুলির শব্দার্থ সম্পর্কে স্পষ্ট এবং দ্ব্যর্থহীন। আমি কোনও কম্পাইলার এই জিনিসটি ভুল হতে দেখিনি।
strcmpতার চেয়ে কম, সমান বা তার চেয়ে বেশি বেশি 0 হিসাবে পরিচিত It এটি -1, 0 বা 1 হওয়ার নিশ্চয়তা দেওয়া হয় না এবং বন্যগুলিতে এমন প্ল্যাটফর্ম রয়েছে যা বাস্তবায়নের গতি অর্জন করতে এই মানগুলিকে ফেরত দেয় না। সুতরাং strcmp(a, b) == TRUEতবে a > bতবে বিপরীত জড়িততা ধরে রাখতে পারে না।
(1==1)এবং 1উভয়ই intমান 1 সহ ধরণের ধ্রুবক প্রকাশ রয়েছে । এগুলি শব্দার্থগতভাবে অভিন্ন। আমি মনে করি আপনি এমন এমন কোড লিখতে পারেন যা পাঠকদের জন্য সরবরাহ করে যারা এটি জানেন না, তবে এটি শেষ কোথায়?
(1 == 1)কৌতুক সংজ্ঞা জন্য দরকারী TRUEএকটি উপায় যে সি স্বচ্ছ হয়, এখনো সি ভাল টাইপিং উপলব্ধ ++,। আপনি যদি "ক্লিন সি" (যেটি সি বা সি ++ হিসাবে সংকলন করেন) নামে একটি উপভাষায় লিখছেন বা যদি আপনি সিপি বা সি ++ প্রোগ্রামাররা ব্যবহার করতে পারেন এমন এপিআই শিরোনাম ফাইলগুলি লিখছেন তবে একই কোডটি সি বা সি ++ হিসাবে ব্যাখ্যা করা যেতে পারে।
সি অনুবাদ ইউনিটে, 1 == 1এর ঠিক একই অর্থ রয়েছে 1; এবং 1 == 0এর একই অর্থ রয়েছে 0। তবে, সি ++ অনুবাদ ইউনিটগুলিতে 1 == 1টাইপ আছে bool। সুতরাং TRUEম্যাক্রো সেইভাবে সংজ্ঞায়িত করে সি ++ তে আরও ভাল সংহত করে।
এটি কীভাবে আরও ভাল সংহত করে তার একটি উদাহরণ হ'ল উদাহরণস্বরূপ যদি ফাংশনটির fooজন্য intএবং এর জন্য ওভারলোড থাকে bool, তবে ওভারলোডটি foo(TRUE)বেছে নেবে bool। যদি TRUEকেবল এটি হিসাবে সংজ্ঞায়িত করা হয় 1, তবে এটি সি ++ এ সুন্দরভাবে কাজ করবে না। ওভারলোড foo(TRUE)চাইবেint
অবশ্যই, C99 চালু bool, trueএবং falseএই হেডার ফাইল ব্যবহার করা যেতে পারে যে C99 এবং সি সঙ্গে কাজ
যাহোক:
TRUEএবং FALSEযেমন (0==0)এবং (1==0)চেয়েও পুরনো C99।আপনি যদি একটি মিশ্র সি এবং সি ++ প্রকল্পে কাজ করছি, এবং C99 চান না পারেন, ছোট হাতের সংজ্ঞায়িত true, falseএবং boolপরিবর্তে।
#ifndef __cplusplus
typedef int bool;
#define true (0==0)
#define false (!true)
#endif
বলা হচ্ছে, 0==0কৌশলটি কিছু প্রোগ্রামাররা এমন কি কোডেও ব্যবহার করেছিলেন (যা?) যা কোনও উপায়ে সি ++ এর সাথে আন্তঃব্যবহার করার উদ্দেশ্য কখনও ছিল না। এটি কোনও কিছুই কিনে না এবং প্রস্তাব দেয় যে প্রোগ্রামারটির সিটিতে বুলিয়ানরা কীভাবে কাজ করে সে সম্পর্কে একটি ভুল ধারণা রয়েছে has
সি ++ এর ব্যাখ্যাটি পরিষ্কার না হলে, এখানে একটি পরীক্ষা প্রোগ্রাম রয়েছে:
#include <cstdio>
void foo(bool x)
{
std::puts("bool");
}
void foo(int x)
{
std::puts("int");
}
int main()
{
foo(1 == 1);
foo(1);
return 0;
}
আউটপুট:
bool
int
ওভারলোড হওয়া সি ++ ফাংশনগুলি কীভাবে মিশ্রিত সি এবং সি ++ প্রোগ্রামিংয়ের সাথে প্রাসঙ্গিক সে সম্পর্কে মন্তব্য থেকে প্রশ্ন করা হয়েছে। এগুলি কেবল একটি প্রকারের পার্থক্য তুলে ধরে। সি ++ হিসাবে সংকলিত trueহওয়ার boolসময় ধ্রুবক হওয়ার জন্য একটি বৈধ কারণ হ'ল পরিষ্কার ডায়াগনস্টিক্স। এটির সর্বোচ্চ সতর্কতা স্তরে, একটি সি ++ সংকলক আমাদের যদি কোনও boolপরামিতি হিসাবে কোনও পূর্ণসংখ্যা পাস করে তবে একটি রূপান্তর সম্পর্কে সতর্ক করতে পারে । ক্লিন সি-তে লেখার একটি কারণ কেবল আমাদের কোডটি আরও পোর্টেবল নয় (যেহেতু এটি সি ++ সংকলকগুলি কেবলমাত্র সি সংকলকগুলি দ্বারা বোঝা যায়) তবে আমরা সি ++ সংকলকগুলির ডায়াগনস্টিক মতামত থেকে উপকৃত হতে পারি।
TRUEসি ++ এর অধীনে পৃথক হবে।
#ifdef __cplusplusআপনার অভিপ্রায়টি আরও স্পষ্টভাবে প্রকাশ করতে ব্যবহার করতে পারেন ।
boolএবং intব্যাপার অনেক না বাস্তবে, যেহেতু তারা পরোক্ষভাবে একে অপরের সাথে পরিবর্তনীয় (এবং এতে আছে কি সি আসলে "একই" , নোট কোট , যদিও) এবং এমন অনেকগুলি পরিস্থিতি নেই যাতে আপনাকে দুজনের মধ্যে সত্যই নিস্পত্তি করতে হবে । " খুব বেশি" সম্ভবত খুব ভারী ছিল, "টেমপ্লেট ব্যবহার করে ওভারলোডিং কোডের তুলনায় অনেক কম" সম্ভবত আরও ভাল হত।
#define TRUE (1==1)
#define FALSE (!TRUE)
সমতুল্য
#define TRUE 1
#define FALSE 0
সি তে
রিলেশনাল অপারেটরগুলির ফলাফল 0বা হয় 1। 1==1থেকে মূল্যায়ন করা নিশ্চিত করা হয় 1এবং !(1==1)করতে মূল্যায়ন করা নিশ্চিত করা হয় 0।
প্রথম ফর্মটি ব্যবহার করার কোনও কারণ নেই। মনে রাখবেন যে প্রথম ফর্মটি প্রায় কমপ্লেয়ারের মতো কম দক্ষ নয় তবে রান-টাইমের পরিবর্তে সংকলন সময়ে ধ্রুবক প্রকাশটি মূল্যায়ন করা হয়। এই নিয়ম অনুসারে এটি অনুমোদিত:
(সি 99, 6.6p2) "রানটাইমের পরিবর্তে অনুবাদ চলাকালীন একটি ধ্রুবক অভিব্যক্তি মূল্যায়ন করা যায় এবং ততক্ষণে স্থির হতে পারে এমন কোনও জায়গায় ব্যবহার করা যেতে পারে।"
আপনি যদি আক্ষরিক TRUEএবং FALSEম্যাক্রোগুলি ব্যবহার না করেন তবে পিসি-লিন্ট এমনকি একটি বার্তা (506, ধ্রুবক মান বুলিয়ান) জারি করবে :
সি জন্য,
TRUEহতে সংজ্ঞায়িত করা উচিত1। তবে অন্যান্য ভাষা 1 টি ব্যতীত পরিমাণ ব্যবহার করে তাই কিছু প্রোগ্রামাররা মনে করেন যে!0এটি নিরাপদ খেলছে।
এছাড়াও C99 এ, stdbool.hবুলিয়ান ম্যাক্রোগুলি trueএবং false সরাসরি আক্ষরিক ব্যবহারের জন্য সংজ্ঞা :
#define true 1
#define false 0
1==1এর মূল্যায়ন করা গ্যারান্টিযুক্ত1
if(foo == true), যা নিছক খারাপ অভ্যাস থেকে ফ্ল্যাট-আউট বগিতে চলে যাবে।
(x == TRUE)চেয়ে আলাদা সত্যের মান থাকতে পারে x।
সি ++ বাদে (ইতিমধ্যে উল্লিখিত), আরও একটি সুবিধা হ'ল স্থির বিশ্লেষণ সরঞ্জামগুলির জন্য। সংকলকটি কোনও অদক্ষতা দূর করে দেবে, তবে তুলনামূলক ফলাফল এবং অন্যান্য পূর্ণসংখ্যার প্রকারের মধ্যে পার্থক্য করার জন্য একটি স্ট্যাটিক বিশ্লেষক তার নিজস্ব বিমূর্ততা ব্যবহার করতে পারে, সুতরাং এটি স্পষ্টভাবে জানে যে সত্যকে অবশ্যই তুলনার ফলাফল হতে হবে এবং এটি সঙ্গতিপূর্ণ বলে ধরে নেওয়া উচিত নয় একটি পূর্ণসংখ্যা সহ
স্পষ্টতই সি বলেছেন যে এগুলি সামঞ্জস্যপূর্ণ, তবে আপনি বাগ বৈশিষ্ট্যগুলি হাইলাইট করতে সহায়তা করার জন্য সেই বৈশিষ্ট্যটির ইচ্ছাকৃত ব্যবহার নিষিদ্ধ করতে পারেন - উদাহরণস্বরূপ, যেখানে কারও বিভ্রান্তি থাকতে পারে &এবং &&বা তারা তাদের অপারেটর প্রাধান্যটি বুংগল করেছে।
if (boolean_var == TRUE) সম্প্রসারণ প্রণালী দ্বারা if (boolean_var == (1 == 1))যার উন্নত ধরনের তথ্য ধন্যবাদ (1 == 1)নোড প্যাটার্ন মধ্যে পড়ে if (<*> == <boolean_expr>)।
বাস্তব পার্থক্য কিছুই নয়। 0মূল্যায়ন করা হয় falseএবং 1মূল্যায়ন করা হয় true। আপনি বুলিয়ান এক্সপ্রেশন ( 1 == 1) বা 1সংজ্ঞায়িত করতে ব্যবহার trueকরেন তা আসলে কোনও পার্থক্য করে না। তারা উভয় মূল্যায়ন করা হয় int।
লক্ষ করুন যে, সি মান গ্রন্থাগার Booleans সংজ্ঞা জন্য কোনো সুনির্দিষ্ট হেডার প্রদান করে: stdbool.h।
trueমূল্যায়ন করা হয় 1এবং falseমূল্যায়ন করা হয় 0। সি নেটিভ বুলিয়ান ধরণের সম্পর্কে জানে না, তারা কেবল অন্তর্নিহিত।
intমান সহ 0বা প্রকারের ফলাফলের ফলাফল দেয় 1। সি এর প্রকৃত বুলিয়ান টাইপ রয়েছে ( _Boolম্যাক্রো boolসংজ্ঞায়িত করা <stdbool.h>হলেও এটি কেবল সি 99 এ যুক্ত হয়েছিল, যা অপারেটরদের শব্দার্থকে নতুন ধরণের ব্যবহার করতে পরিবর্তন দেয়নি ।
_Bool, এবং <stdbool.h>আছে #define bool _Bool।
1 == 1যেভাবে মূল্যায়ন করছেন তা ঠিকই বলেছেন int। সম্পাদনা করা হয়েছে।
সত্যের সমান যে সঠিক মানটি আমরা জানি না এবং সংকলকগুলির নিজস্ব সংজ্ঞা থাকতে পারে। সুতরাং আপনি কী গোপন করবেন সংজ্ঞা সংস্থার অভ্যন্তরীণটি সংজ্ঞাটির জন্য ব্যবহার করা। আপনার যদি প্রোগ্রামিংয়ের ভাল অভ্যাস থাকে তবে এটি সর্বদা প্রয়োজন হয় না তবে কিছু খারাপ কোডিং শৈলীর জন্য সমস্যা এড়াতে পারেন, উদাহরণস্বরূপ:
যদি ((ক> খ) == সত্য)
আপনি যদি সত্যকে 1 হিসাবে ম্যানুয়ালি সংজ্ঞায়িত করেন তবে সত্যের অভ্যন্তরীণ মান আরেকটি হলে এটি বিপর্যয় হতে পারে।
>অপারেটর সর্বদা সত্যের জন্য 1 দেয়, মিথ্যা হিসাবে 0 দেয়। কোনও সি সংকলক এটি ভুল হওয়ার সম্ভাবনা নেই। সাম্যতা তুলনা করে TRUEএবং FALSEনিম্ন মানের হয়; উপরোক্ত হিসাবে আরও স্পষ্টভাবে লেখা হয় if (a > b)। তবে বিভিন্ন সি সংকলক সত্য এবং মিথ্যাটিকে আলাদাভাবে আচরণ করতে পারে এই ধারণাটি ভুল।
সাধারণত সি প্রোগ্রামিং ভাষায়, 1 টি সত্য হিসাবে সংজ্ঞায়িত হয় এবং 0 টি মিথ্যা হিসাবে সংজ্ঞায়িত হয়। সুতরাং আপনি নীচে বেশিরভাগ ক্ষেত্রে কেন দেখেন:
#define TRUE 1
#define FALSE 0
তবে, 0 এর সমান নয় এমন কোনও সংখ্যা শর্তাধীন বিবৃতিতে সত্য হিসাবেও মূল্যায়ন করা হবে। অতএব নীচের ব্যবহার করে:
#define TRUE (1==1)
#define FALSE (!TRUE)
আপনি খালি স্পষ্ট করে দেখাতে পারেন যে সত্যকে অসত্যের সমান করে এটি নিরাপদে খেলতে চেষ্টা করছেন।
#define TRUE (’/’/’/’);#define FALSE (’-’-’-’)( কোডিং- গাইডলাইনস /cbook/cbook1_1.pdf পৃষ্ঠা 871 থেকে নেওয়া )