হ্যাঁ / কোন, সত্য / মিথ্যা এবং উদ্দেশ্য-গ এর মধ্যে সত্য / মিথ্যা এর মধ্যে কি পার্থক্য রয়েছে?


154

সহজ প্রশ্ন সত্যিই; এই মানগুলির মধ্যে কি পার্থক্য রয়েছে (এবং বিওওএল এবং বুলের মধ্যে কোনও পার্থক্য রয়েছে)? একজন সহকর্মী উল্লেখ করেছিলেন যে তারা ওজেক্টিভ-সি-তে বিভিন্ন জিনিসের মূল্যায়ন করে, তবে আমি যখন তাদের নিজ নিজ .h ফাইলগুলিতে টাইপডেফগুলির দিকে তাকাই, তখন হ্যাঁ / সত্য / সত্য সমস্তই সংজ্ঞায়িত হয়েছিল 1এবং NO / FALSE / মিথ্যা সমস্তই হিসাবে সংজ্ঞায়িত হয়েছিল 0। আসলেই কি কোনও পার্থক্য আছে?


5
ব্যবহারিক দৃষ্টিকোণ থেকে কোন পার্থক্য নেই। পার্থক্য প্রদর্শনের জন্য আপনি সম্ভবত বিভিন্ন কৌশল করতে পারেন তবে আপনি সাধারণত "অপরিজ্ঞাত আচরণ" অঞ্চলে বিপথগামী হয়ে যাবেন।
হট লিক্স

উত্তর:


84

কোন ব্যবহারিক পার্থক্য নেই প্রদান করা আপনি ব্যবহার BOOLBooleans যেমন ভেরিয়েবল। সি 0 বা 0 না-তে মূল্যায়ন করে কিনা তার উপর ভিত্তি করে বুলিয়ান অভিব্যক্তিগুলি প্রক্রিয়া করে So সুতরাং:

if(someVar ) { ... }
if(!someVar) { ... }

মানে একই

if(someVar!=0) { ... }
if(someVar==0) { ... }

এজন্য আপনি যে কোনও আদিম প্রকার বা অভিব্যক্তিটিকে বুলিয়ান পরীক্ষা হিসাবে মূল্যায়ন করতে পারেন (যেমন, উদাহরণস্বরূপ পয়েন্টার)। মনে রাখবেন যে আপনার পূর্বেরটি করা উচিত, পরে নয়।

নোট যে হয় একটি পার্থক্য আপনি একটি তথাকথিত ভোঁতা মান নির্ধারণ BOOLপরিবর্তনশীল এবং নির্দিষ্ট মানের জন্য পরীক্ষা, তাই সবসময় Booleans তাদের ব্যবহার এবং শুধুমাত্র তাদের থেকে তাদের দায়িত্ব অর্পণ #defineমান।

গুরুত্বপূর্ণভাবে, কোনও বর্ণের তুলনা ব্যবহার করে কখনই বুলিয়ান পরীক্ষা না করে - এটি কেবল ঝুঁকিপূর্ণ নয় কারণ someVarএকটি শূন্য-ন্যূনতম মূল্য হ'ল যা হ্যাঁ নয়, তবে আমার মতে, এটি উদ্দেশ্যটি সঠিকভাবে প্রকাশ করতে ব্যর্থ হয়েছে:

if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!

অন্য কথায়, কন্সট্রাক্টসগুলি ব্যবহারের উদ্দেশ্যে এবং নথিবদ্ধ হওয়ার কারণে তাদের ব্যবহার করুন এবং আপনি সি-তে আঘাতের জগত থেকে নিজেকে রক্ষা করবেন


100

আমি বিশ্বাস করি যে এর মধ্যে একটি পার্থক্য রয়েছে boolএবং BOOLএই ওয়েবপৃষ্ঠাটি চেক করে দেখুন কেন:
http://iosdevelopertips.com

কারণ BOOLএকটি নয় unsigned charবরং একটি আদিম ধরন, ধরনের ভেরিয়েবল BOOLছাড়া অন্য মান ধারণ করতে পারে YESএবং NO

এই কোডটি বিবেচনা করুন:

BOOL b = 42;

if (b) {
    printf("b is not NO!\n");
}

if (b != YES) {
    printf("b is not YES!\n");
}

আউটপুটটি হ'ল:

খ কোন হয় না!
বি হ্যাঁ না!

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


5
কিন্তু মনে রাখবেন যে ছিল না মূল সি বাস্তবায়ন bool, এবং অতএব ঐতিহ্য একটি ব্যবহার করতে হয়েছে intবা charএকটি বুলিয়ান হিসাবে, কখনও কখনও একটি # define পার্থক্য লুকাতে এবং কখনও কখনও না করার জন্য অন্তর্ভুক্ত। আসলে, আমি নিশ্চিত না যে এমনকি বর্তমান মানদণ্ডগুলি boolএমনভাবে প্রয়োগ করা প্রয়োজন যা এটির অভ্যন্তরীণ কাঠামো পরীক্ষা করে বাধা দেয়।
হট লিকস

1
যদিও, প্রথম printfমিথ্যা বলে। মানটি bহয় না YES, এটি "শূন্য নয়" যা শর্তটি পরীক্ষা করে। সুতরাং আপনার থাকা উচিত printf("b is not zero"), যা অগত্যা একই রকম নয় YES। এই ক্ষেত্রে, bউভয়ই "শূন্য নয়" এবং "হ্যাঁ নয়"।
লরেন্স ডল

ধন্যবাদ লরেন্স, আমি এই লাইন বরাবর একটি আপডেট করেছি।
ড্যান জে

আসলে, আমি দ্বিতীয় আউটপুটটি এক্সকোড 8.2 এ পাইনি। আমি কোথায় ব্যর্থ?
ইগোর কিসলিক

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

52

আমি এটির উপর একটি বিস্তৃত পরীক্ষা করেছি। আমার ফলাফলগুলি তাদের পক্ষে কথা বলা উচিত:

//These will all print "1"
NSLog(@"%d", true == true);
NSLog(@"%d", TRUE == true);
NSLog(@"%d", YES  == true);
NSLog(@"%d", true == TRUE);
NSLog(@"%d", TRUE == TRUE);
NSLog(@"%d", YES  == TRUE);
NSLog(@"%d", true == YES);
NSLog(@"%d", TRUE == YES);
NSLog(@"%d", YES  == YES);

NSLog(@"%d", false == false);
NSLog(@"%d", FALSE == false);
NSLog(@"%d", NO    == false);
NSLog(@"%d", false == FALSE);
NSLog(@"%d", FALSE == FALSE);
NSLog(@"%d", NO    == FALSE);
NSLog(@"%d", false == NO);
NSLog(@"%d", FALSE == NO);
NSLog(@"%d", NO    == NO);


//These will all print "0"
NSLog(@"%d", false == true);
NSLog(@"%d", FALSE == true);
NSLog(@"%d", NO    == true);
NSLog(@"%d", false == TRUE);
NSLog(@"%d", FALSE == TRUE);
NSLog(@"%d", NO    == TRUE);
NSLog(@"%d", false == YES);
NSLog(@"%d", FALSE == YES);
NSLog(@"%d", NO    == YES);

NSLog(@"%d", true == false);
NSLog(@"%d", TRUE == false);
NSLog(@"%d", YES  == false);
NSLog(@"%d", true == FALSE);
NSLog(@"%d", TRUE == FALSE);
NSLog(@"%d", YES  == FALSE);
NSLog(@"%d", true == NO);
NSLog(@"%d", TRUE == NO);
NSLog(@"%d", YES  == NO);

আউটপুটটি হ'ল:

2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.072 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.076 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.082 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.091 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.092 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.097 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.098 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.101 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0

3
[[NSObject] বরাদ্দ] init] সত্য বা হ্যাঁ সমান হয় না। সুতরাং ([[NSObject] বরাদ্দ] init] == ​​সত্য) এর সাথে অবজেক্ট ইনিশিয়ালাইজের জন্য পরীক্ষা করা ব্যর্থ হবে। সত্যিকার অর্থে কোনও শূন্য মান যখন করবে তখন আমি একটি ভাষার একক "সত্য" মান সংজ্ঞায়িত করতে স্বাচ্ছন্দ্য বোধ করি না।
DrFloyd5

3
@ সামুয়েলরেঙ্কার্ট আমি কখনই ভাষা ifবা ন-বুলিয়ান মূল্য গ্রহণের সাথে স্বাচ্ছন্দ্য বোধ করি না while। লাইক ... while("guitar gently weeps")কাজ করা উচিত নয় ...
সুপহস্তার

2003 এ স্যামুয়েলরেঙ্কার্ট লিনাক্সের পিছনের দিকের সন্ধানও পেয়েছিল:if (user_id = ROOT_UID)
সুপুস্টার

14

আপনি এই প্রশ্নের উত্তরগুলি পড়তে চাইতে পারেন । সংক্ষেপে, অবজেক্টিভ সি-তে (objc.h এর সংজ্ঞা থেকে):

typedef signed char        BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED


#define YES             (BOOL)1
#define NO              (BOOL)0

11

মেন (বিপজ্জনক!) পার্থক্য trueএবং YESতাদেরকে JSON ধারাবাহিকতাতে হয়।

উদাহরণস্বরূপ, আমাদের কাছে JSON- টাইপ সার্ভারের অনুরোধ রয়েছে এবং জেসন সেন্সে সত্য / মিথ্যা প্রেরণ করতে হবে:

NSDictionary *r1 = @{@"bool" : @(true)};
NSDictionary *r2 = @{@"bool" : @(YES)};
NSDictionary *r3 = @{@"bool" : @((BOOL)true)};

তারপরে এটি পাঠানোর আগে আমরা এটি JSON স্ট্রিংয়ে রূপান্তর করি

NSData *data = [NSJSONSerialization  dataWithJSONObject:requestParams options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

ফলাফল হলো

jsonString1 // {"bool":1}
jsonString2 // {"bool":true}
jsonString3 // {"bool":true}

এপিআই যুক্তির কারণে jsonString1একটি ত্রুটি হতে পারে।

সুতরাং অবজেক্টিভ-সি-তে বুলিয়ানগুলির সাথে সতর্কতা অবলম্বন করুন।

যোগফল, শুধুমাত্র সঠিক @YESএবং casted মান হিসাবে @((BOOL)expression)হয় __NSCFBooleanধরন এবং রূপান্তরিত trueতাদেরকে JSON ধারাবাহিকতাতে সঙ্গে। @(expression1 && expression2)(এমনকি @(YES && YES)) এর মতো অন্য কোনও এক্সপ্রেশন JSON এ __NSCFNumber (int)টাইপ এবং রূপান্তরিত 1

পিএস আপনি কেবল স্ট্রিং-মূল্যবান বুলিয়ান ব্যবহার করতে পারেন

@{@"bool" : @"true"}; // in JSON {"bool":true}

1

এখানে একটি সূক্ষ্ম বাগ রয়েছে যা এখানে কেউ উল্লেখ করেনি, আমি ভেবেছিলাম যে আমি কোনও কিছুর চেয়ে যুক্তিযুক্ত ত্রুটি আরও অন্তর্ভুক্ত করব:

int i = 2;
if(i);        //true
if(i==YES);   // false
if((!!i)==YES); //true

সুতরাং এখানে সমস্যাটি ঠিক এটি (YES==1)এবং সিতে তুলনাটি কোনও বুলিয়ান নয়, তবে একটি মানের উপর ভিত্তি করে।

কারণ YESএটি কেবলমাত্র একটি #define(ভাষার অভ্যন্তরীণ কিছুের চেয়ে), এটির কিছু মূল্য হতে হবে এবং 1সর্বাধিক অর্থবোধ করে।


এটি কম বিশদের সাথে 2+ বছর আগে ডেনজে'র সমান উত্তর।
লরেন্স ডল

@ লাওরেন্সডল আমি জানি না, এটি উল্লেখ করেছে যে হ্যাঁ কেবলমাত্র 1 টি সংজ্ঞায়িত এবং ভাষার সাথে অন্তর্নিহিত নয়, এটি উচ্চ স্তরের ভাষায় হতে পারে ... কেউ সম্ভবত এর থেকে মান পেতে পারে ... তবে ভাল ইয়া সহ ট্রলিং
গ্রেডি প্লেয়ার

0

আমি মনে করি যে তারা অনেক ক্ষেত্রে আরও স্ব-বর্ণনামূলক হতে YES / NO যুক্ত করে। উদাহরণ স্বরূপ:

[button setHidden:YES];

চেয়ে ভাল শোনাচ্ছে

[button setHidden:TRUE];

2
আমি দ্বিমত পোষণ করি; তারা উভয়ই আমার কাছে একই রকম পড়ে। যাইহোক, কোনও UI- এ কোনও সাধারণ ব্যক্তির জন্য আমি মনে করি হ্যাঁ / না খুব সুন্দর দেখাচ্ছে।
লরেন্স ডল

16
আমিও দ্বিমত পোষণ করি। যদি কিছু হয় তবে বছরের পর বছর ধরে অন্যান্য ভাষায় ব্যবহৃত হয় এমন অনুলিখিত মানকে আটকে না রাখার কারণে এটি খারাপভাবে পড়ে। আপনি যখন প্রচুর পরিমাণে মানতে ব্যর্থ হন তখন কী হয় তার একটি প্রধান উদাহরণ আইই IE
ফ্রিএএসআইনবিয়ার

1
২ টি
অনর্থক

-2

প্রথমে সত্য এবং মিথ্যা কী এবং প্রথম স্থানটিতে তাদের কী অর্থ দেয় তা পরীক্ষা করে দেখা যাক।

নীচের মতো ল্যাম্বডা ক্যালকুলাসে যদি 'b' অন্যথায় সি বলা হয় তবে আমরা একটি কাঠামো তৈরি করতে পারি:

(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)

জাভাস্ক্রিপ্টে, এটি এর মতো দেখাচ্ছে:

(function(ifThenElse) {
    // use ifThenElse
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
});

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

আমরা নিম্নলিখিত হিসাবে এই ফাংশন সংজ্ঞায়িত করতে পারেন:

(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)

জাভাস্ক্রিপ্টে এটি দেখতে এমন দেখাচ্ছে:

(function(True) {
    // use True
})(function(a) {
     return function(b) {
         return a;
     }
});

(function(False) {
    // use True
})(function(a) {
     return function(b) {
         return b;
     }
});

এখন আমরা নিম্নলিখিতটি করতে পারি

(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())

দোটিস এবং ডুথটি হচ্ছে (\ ক। ()) কারণ ল্যাম্বদা ক্যালকুলাস কোনও মুদ্রণ / গণিত / স্ট্রিংয়ের মতো কোনও পরিষেবা সরবরাহ করে না, আমরা যা করতে পারি তা কিছুই করে না এবং বলে যে আমরা এটি করেছি (এবং পরে পরিষেবাগুলিতে প্রতিস্থাপনের মাধ্যমে প্রতারণা করব) আমাদের সিস্টেম যা পার্শ্ব প্রতিক্রিয়া প্রদান করে আমরা চাই)

সুতরাং আসুন এটি কর্মে দেখুন।

(function(True) {
    return (function(False) {
        return (function(ifThenElse) {
            return (function(doThis) {
                return (function(doThat) {
                    return ifThenElse(True)(doThis)(doThat);
                });
            });
        });
    })
})(function(a) {
     return function(b) {
         return a;
     }
})(function(a) {
     return function(b) {
         return b;
     }
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
})(function(a) { console.log("you chose LEFT!"); })
(function(a) {console.log("you chose RIGHT");})();

এটি একটি গভীর পরিবেশ যা সরল করা যেতে পারে যদি আমরা একাধিক ফাংশনগুলিতে বিভক্ত হয়ে অ্যারে / মানচিত্র / যুক্তি / বা একাধিক বিবৃতি ব্যবহার করার অনুমতি পাই তবে আমি রাখতে চাই যতটা নির্ভুল আমি নিজেকে ঠিক একটি যুক্তির ফাংশনে সীমাবদ্ধ রাখতে পারি কেবল.

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

তাই সংক্ষেপে

function ChooseRight(left) {
    return function _ChooseRight_inner(right) {
        return right;
    }
}
function ChooseLeft(left) {
    return function _ChooseLeft_inner(right) {
        return left;
    }
}

var env = {
    '0': ChooseLeft,
    '1': ChooseRight,
    'false': ChooseRight,
    'true': ChooseLeft,
    'no': ChooseRight
    'yes': ChooseLeft,
    'snd': ChooseRight,
    'fst': ChooseLeft
};
var _0 = env['0'];
var _1 = env['1'];
var _true = env['true'];
var _false = env['false'];
var yes = env['yes'];
var no = env['no'];

// encodes church zero or one to boolean
function lambda_encodeBoolean(self) {
    return self(false)(true);
}
// decodes a Boolean to church zero or one
function lambda_decodeBoolean(self) {
    console.log(self, self ? env['true'] : env['false']);
    return self ? env['true'] : env['false'];
}

lambda_decodeBoolean('one' === 'two')(function() {
    console.log('one is two');
})(function() {
    console.log('one is not two');
})();

lambda_decodeBoolean('one' === 'one')(function() {
    console.log('one is one');
})(function() {
    console.log('one is not one');
})();

-7

না, হ্যাঁ / কোনটি সত্য / মিথ্যা (1/0) উল্লেখ করার আলাদা উপায়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.