কেন # বুলিয়ান ম্যাক্রোতে কেবল 1 এর পরিবর্তে # সংজ্ঞাটি সত্য (1 == 1)?


160

আমি সি তে সংজ্ঞা দেখেছি

#define TRUE (1==1)
#define FALSE (!TRUE)

এটি কি প্রয়োজনীয়? সত্যকে কেবল 1 হিসাবে এবং FALSE কে 0 হিসাবে সংজ্ঞায়িত করার সুবিধা কী?


35
এবং আরো: #define TRUE (’/’/’/’); #define FALSE (’-’-’-’)( কোডিং- গাইডলাইনস /cbook/cbook1_1.pdf পৃষ্ঠা 871 থেকে নেওয়া )
osgx

2
না, এটি অজ্ঞান ^ ওয়ান্ডারফর্মড দ্বারা সত্যই, দ্বারা প্যারানোয়া। সি, 1 এবং 0 তে সমস্ত পরিস্থিতিতে একই রকম হয়।
জেনস

@osgx এর অর্থ কী?
mrgloom

উত্তর:


155

এই পদ্ধতির প্রকৃত booleanপ্রকারটি ব্যবহার করা হবে (এবং সমাধান করতে trueএবং false) যদি সংকলক সমর্থন করে। (বিশেষত, সি ++)

তবে, সি ++ ব্যবহার হচ্ছে কিনা তা যাচাই করা ভাল ( __cplusplusম্যাক্রোর মাধ্যমে ) এবং প্রকৃতপক্ষে trueএবং ব্যবহার করে false

একটি সি সংকলনে এটি সমান 0এবং 1
(দ্রষ্টব্য যে ক্রিয়াকলাপ অপসারণের ফলে ক্রমের ক্রমটি ভেঙে যাবে)


7
এটি ভুল, এখানে বুল ব্যবহার করা হয় না। ফলাফল 1==1একটি int। ( স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 686877৪০৩/২ দেখুন ।)
মাদুর

4
@ ম্যাট: এমনকি সি ++ তেও booleanটাইপ সহ?
এসএলএক্স

9
প্রশ্নটি সি ট্যাগ করা হয়, তবে প্রকৃতপক্ষে সি ++ এ রিলেশনাল অপারেটরগুলি ফিরে আসে trueবা false
মাদুর

5
@ ম্যাট: আমি অনুমান করছি যে সি ++ দিয়ে ভাল খেলতে এই জাতীয় কোড সি হেডারে লেখা হয়েছিল
স্লাকস

20
@SLaks যদি সি ++ দিয়ে চমৎকার খেলতে চেয়েছিলেন, এটা হবে #define TRUE trueএবং #define FALSE falseযখনই __cplusplusসংজ্ঞায়িত করা হয়।
নিকস সি।

137

উত্তরটি বহনযোগ্যতা। এর সাংখ্যিক মান 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.

আপনি প্রায়শই উত্পাদনের কোডগুলিতে এই "খারাপ উদাহরণগুলি" খুঁজে পেতে পারেন এবং অনেক অভিজ্ঞ প্রোগ্রামাররা তাদের কসম খায়: তারা কাজ করে, কিছু তাদের (পেডেন্টালি?) সঠিক বিকল্পের চেয়ে ছোট হয় এবং আইডিয়ামগুলি প্রায় সর্বজনীন স্বীকৃত। তবে বিবেচনা করুন: "ডান" সংস্করণগুলি কম দক্ষ নয়, তাদের পোর্টেবল হওয়ার গ্যারান্টি রয়েছে, তারা এমনকি কঠোরতম লাইনারও পাস করবেন এবং এমনকি নতুন প্রোগ্রামারগুলি সেগুলি বুঝতে পারবে।

এটা কি মূল্য নয়?


6
(1==1)এর চেয়ে বেশি বহনযোগ্য আর কিছু নয় 1। সংকলকের নিজস্ব বিধিগুলি সি ভাষার মতো যা সমতা এবং সম্পর্কিত অপারেটরগুলির শব্দার্থ সম্পর্কে স্পষ্ট এবং দ্ব্যর্থহীন। আমি কোনও কম্পাইলার এই জিনিসটি ভুল হতে দেখিনি।
কিথ থম্পসন

1
প্রকৃতপক্ষে প্রত্যাবর্তিত মানটি strcmpতার চেয়ে কম, সমান বা তার চেয়ে বেশি বেশি 0 হিসাবে পরিচিত It এটি -1, 0 বা 1 হওয়ার নিশ্চয়তা দেওয়া হয় না এবং বন্যগুলিতে এমন প্ল্যাটফর্ম রয়েছে যা বাস্তবায়নের গতি অর্জন করতে এই মানগুলিকে ফেরত দেয় না। সুতরাং strcmp(a, b) == TRUEতবে a > bতবে বিপরীত জড়িততা ধরে রাখতে পারে না।
ম্যাকিয়েজ পাইচোটকা

2
@ কিথথম্পসন - সম্ভবত "বহনযোগ্যতা" ভুল শব্দ ছিল। তবে সত্যটি থেকে যায় যে (1 == 1) একটি বুলিয়ান মান; 1 হয় না।
অ্যাডাম লিস

2
@ অ্যাডমিস: সি তে (1==1)এবং 1উভয়ই intমান 1 সহ ধরণের ধ্রুবক প্রকাশ রয়েছে । এগুলি শব্দার্থগতভাবে অভিন্ন। আমি মনে করি আপনি এমন এমন কোড লিখতে পারেন যা পাঠকদের জন্য সরবরাহ করে যারা এটি জানেন না, তবে এটি শেষ কোথায়?
কিথ থমসন

2
'নয়' 5 বিট স্তরে প্রকৃতপক্ষে -6।
ওলিভিরাজর

51

(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 থেকে দূরে থাকার এবং সি 90 এর সাথে কাজ করার এখনও বেশ কয়েকটি ভাল কারণ রয়েছে।

আপনি যদি একটি মিশ্র সি এবং সি ++ প্রকল্পে কাজ করছি, এবং 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পরামিতি হিসাবে কোনও পূর্ণসংখ্যা পাস করে তবে একটি রূপান্তর সম্পর্কে সতর্ক করতে পারে । ক্লিন সি-তে লেখার একটি কারণ কেবল আমাদের কোডটি আরও পোর্টেবল নয় (যেহেতু এটি সি ++ সংকলকগুলি কেবলমাত্র সি সংকলকগুলি দ্বারা বোঝা যায়) তবে আমরা সি ++ সংকলকগুলির ডায়াগনস্টিক মতামত থেকে উপকৃত হতে পারি।


3
দুর্দান্ত, এবং underappreciated, উত্তর। এটি মোটেও সুস্পষ্ট নয় যে এর দুটি সংজ্ঞা TRUEসি ++ এর অধীনে পৃথক হবে।
ব্যবহারকারী 481516234242

4
কীভাবে ওভারলোড হওয়া ফাংশনগুলি কোডের সাথে প্রাসঙ্গিক যা সি এবং সি ++ উভয় হিসাবে সংকলিত হয়?
কিথ থম্পসন

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

1
@ খ্রিস্টিয়ানআর: আপনার অর্থ কী "প্রকারের বিষয়ে খুব বেশি যত্নশীল হয় না"? প্রকারভেদগুলি সি ভাষার মূল কেন্দ্র; সি প্রোগ্রামের প্রতিটি এক্সপ্রেশন, মান এবং অবজেক্টের ভাল সংজ্ঞা দেওয়া আছে। আপনি যদি সি এবং সি ++ তে কিছু আলাদাভাবে সংজ্ঞায়িত করতে চান ( বিরল ক্ষেত্রে যেখানে আপনাকে আসলে কোড লিখতে হবে যা সি এবং সি ++ উভয় হিসাবে সংকলিত হয়), আপনি #ifdef __cplusplusআপনার অভিপ্রায়টি আরও স্পষ্টভাবে প্রকাশ করতে ব্যবহার করতে পারেন ।
কিথ থম্পসন

@ কিথথম্পসন হ্যাঁ আমি জানি কীভাবে প্রকারগুলি গুরুত্বপূর্ণ। এটা ঠিক যে সব ছাড়া মধ্যে বিভেদ মত ওভারলোডিং ও টেমপ্লেট, জিনিষ মত টাইপ-সচেতন কাপড় boolএবং intব্যাপার অনেক না বাস্তবে, যেহেতু তারা পরোক্ষভাবে একে অপরের সাথে পরিবর্তনীয় (এবং এতে আছে কি সি আসলে "একই" , নোট কোট , যদিও) এবং এমন অনেকগুলি পরিস্থিতি নেই যাতে আপনাকে দুজনের মধ্যে সত্যই নিস্পত্তি করতে হবে । " খুব বেশি" সম্ভবত খুব ভারী ছিল, "টেমপ্লেট ব্যবহার করে ওভারলোডিং কোডের তুলনায় অনেক কম" সম্ভবত আরও ভাল হত।
খ্রিস্টান রাউ

18
#define TRUE (1==1)
#define FALSE (!TRUE)

সমতুল্য

#define TRUE  1
#define FALSE 0

সি তে

রিলেশনাল অপারেটরগুলির ফলাফল 0বা হয় 11==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
আমার সন্দেহ আছে, প্রতিটি ব্যবহারের ক্ষেত্রে TRU প্রতি 1 == 1 দিয়ে প্রতিস্থাপন করা হয়, যখন 1 ব্যবহার করে 1 প্রতিস্থাপন করা হয়, প্রথম পদ্ধতির অতিরিক্ত তুলনা ওভারহেড নয় কি ... বা এটি অপ্টিমাইজড সংকলক তৈরি করা হয়েছে?
গোলাপী প্যান্থার

4
@ পিংকপ্যান্থার ধ্রুবক প্রকাশগুলি সাধারণত সংকলনের সময়ে মূল্যায়ন করা হয় এবং সুতরাং কোনও ওভারহেড প্ররোচিত করবেন না।
ওয়াহ

2
1==1এর মূল্যায়ন করা গ্যারান্টিযুক্ত1
ah

3
@NikosC। এটাই এক ভাল প্রশ্ন। ফর্মের কোডের জন্য এটি গুরুত্বপূর্ণ if(foo == true), যা নিছক খারাপ অভ্যাস থেকে ফ্ল্যাট-আউট বগিতে চলে যাবে।
djechlin

1
বিপদগুলি নির্দেশ করার জন্য +1 এর (x == TRUE)চেয়ে আলাদা সত্যের মান থাকতে পারে x
জোশুয়া টেলর

12

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

স্পষ্টতই সি বলেছেন যে এগুলি সামঞ্জস্যপূর্ণ, তবে আপনি বাগ বৈশিষ্ট্যগুলি হাইলাইট করতে সহায়তা করার জন্য সেই বৈশিষ্ট্যটির ইচ্ছাকৃত ব্যবহার নিষিদ্ধ করতে পারেন - উদাহরণস্বরূপ, যেখানে কারও বিভ্রান্তি থাকতে পারে &এবং &&বা তারা তাদের অপারেটর প্রাধান্যটি বুংগল করেছে।


1
এটা একটা ভাল পয়েন্ট আছে, এবং হয়ত এই সরঞ্জামগুলি কিছু এমনকি নিরীহ কোড ধরতে পারে if (boolean_var == TRUE) সম্প্রসারণ প্রণালী দ্বারা if (boolean_var == (1 == 1))যার উন্নত ধরনের তথ্য ধন্যবাদ (1 == 1)নোড প্যাটার্ন মধ্যে পড়ে if (<*> == <boolean_expr>)
কাজ

4

বাস্তব পার্থক্য কিছুই নয়। 0মূল্যায়ন করা হয় falseএবং 1মূল্যায়ন করা হয় true। আপনি বুলিয়ান এক্সপ্রেশন ( 1 == 1) বা 1সংজ্ঞায়িত করতে ব্যবহার trueকরেন তা আসলে কোনও পার্থক্য করে না। তারা উভয় মূল্যায়ন করা হয় int

লক্ষ করুন যে, সি মান গ্রন্থাগার Booleans সংজ্ঞা জন্য কোনো সুনির্দিষ্ট হেডার প্রদান করে: stdbool.h


অবশ্যই আপনি করেন নি ... তবে কিছু লোক অন্যথায় বিশেষত নেতিবাচক সংখ্যার জন্য ভাবেন সম্ভবত :)
গোলাপী প্যান্থার

কি? আপনি এটি পিছনের দিকে আছে। trueমূল্যায়ন করা হয় 1এবং falseমূল্যায়ন করা হয় 0। সি নেটিভ বুলিয়ান ধরণের সম্পর্কে জানে না, তারা কেবল অন্তর্নিহিত।
djechlin

সিতে, রিলেশনাল এবং ইক্যুয়ালিটি অপারেটরগুলি intমান সহ 0বা প্রকারের ফলাফলের ফলাফল দেয় 1। সি এর প্রকৃত বুলিয়ান টাইপ রয়েছে ( _Boolম্যাক্রো boolসংজ্ঞায়িত করা <stdbool.h>হলেও এটি কেবল সি 99 এ যুক্ত হয়েছিল, যা অপারেটরদের শব্দার্থকে নতুন ধরণের ব্যবহার করতে পরিবর্তন দেয়নি ।
কিথ থম্পসন

@djechlin: 1999 মানক হিসাবে, সি আছে একটি নেটিভ বুলিয়ান টাইপ আছে। এটি বলা হয় _Bool, এবং <stdbool.h>আছে #define bool _Bool
কিথ থমসন

@ কিথথম্পসন, আপনি 1 == 1যেভাবে মূল্যায়ন করছেন তা ঠিকই বলেছেন int। সম্পাদনা করা হয়েছে।
জুতো

3

সত্যের সমান যে সঠিক মানটি আমরা জানি না এবং সংকলকগুলির নিজস্ব সংজ্ঞা থাকতে পারে। সুতরাং আপনি কী গোপন করবেন সংজ্ঞা সংস্থার অভ্যন্তরীণটি সংজ্ঞাটির জন্য ব্যবহার করা। আপনার যদি প্রোগ্রামিংয়ের ভাল অভ্যাস থাকে তবে এটি সর্বদা প্রয়োজন হয় না তবে কিছু খারাপ কোডিং শৈলীর জন্য সমস্যা এড়াতে পারেন, উদাহরণস্বরূপ:

যদি ((ক> খ) == সত্য)

আপনি যদি সত্যকে 1 হিসাবে ম্যানুয়ালি সংজ্ঞায়িত করেন তবে সত্যের অভ্যন্তরীণ মান আরেকটি হলে এটি বিপর্যয় হতে পারে।


সি-তে, >অপারেটর সর্বদা সত্যের জন্য 1 দেয়, মিথ্যা হিসাবে 0 দেয়। কোনও সি সংকলক এটি ভুল হওয়ার সম্ভাবনা নেই। সাম্যতা তুলনা করে TRUEএবং FALSEনিম্ন মানের হয়; উপরোক্ত হিসাবে আরও স্পষ্টভাবে লেখা হয় if (a > b)। তবে বিভিন্ন সি সংকলক সত্য এবং মিথ্যাটিকে আলাদাভাবে আচরণ করতে পারে এই ধারণাটি ভুল।
কিথ থম্পসন

2
  1. তালিকাবদ্ধ

সাধারণত সি প্রোগ্রামিং ভাষায়, 1 টি সত্য হিসাবে সংজ্ঞায়িত হয় এবং 0 টি মিথ্যা হিসাবে সংজ্ঞায়িত হয়। সুতরাং আপনি নীচে বেশিরভাগ ক্ষেত্রে কেন দেখেন:

#define TRUE 1 
#define FALSE 0

তবে, 0 এর সমান নয় এমন কোনও সংখ্যা শর্তাধীন বিবৃতিতে সত্য হিসাবেও মূল্যায়ন করা হবে। অতএব নীচের ব্যবহার করে:

#define TRUE (1==1)
#define FALSE (!TRUE)

আপনি খালি স্পষ্ট করে দেখাতে পারেন যে সত্যকে অসত্যের সমান করে এটি নিরাপদে খেলতে চেষ্টা করছেন।


4
আমি এটিকে "নিরাপদ খেলানো" বলব না - বরং আপনি নিজেরাই সুরক্ষার ভ্রান্ত ধারণা দিচ্ছেন।
ডডজেথেসট্রোলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.