প্রশ্ন-চিহ্ন এবং কোলন (?: টেরিনারি অপারেটর) অর্থ-সি এর অর্থ কী?


270

কোডের এই লাইনটির অর্থ কী?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

?এবং :আমাকে বিভ্রান্ত করে।


1
এটি ত্রৈমাসিক যদি অন্যথায় অপারেটর হয়
ক্লাউস বাইস্কোভ পেদারসেন

3
নোট করুন যে এটি প্রশ্ন চিহ্ন হওয়া উচিত, উদ্ধৃতি চিহ্ন নয়।
clahey

6
সংকলকটিও অনুমতি দেয় বলে মনে হয় variable ?: anotherVariable, এর অর্থ কী? '
টনি

15
প্রথম এলিমেন্টবিহীন টার্নারিটির অর্থ একই(valOrVar != 0) ? valOrVar : anotherValorvar
স্কট লাহেটাইন

উত্তর:


430

এটি সি টার্নারি অপারেটর (উদ্দেশ্য-সি হ'ল সি-সুপারিটসেট):

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

শব্দার্থগত সমতুল্য

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

কোনও প্রথম উপাদান (উদাঃ variable ?: anotherVariable) সহ তিনটি অর্থ একই হিসাবে(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(আপডেট: ইয়াক! উত্তর হিসাবে পুনরায় পোস্ট করা)) টার্নারি অপারেটরটির জন্য যা গুরুত্বপূর্ণ তা হ'ল এটি এমন জায়গায় ব্যবহার করা যেতে পারে যেখানে যদি অন্যথায় না পারে। অর্থাত: একটি শর্ত বা পদ্ধতির প্যারামিটারের ভিতরে। [এনএসএস স্ট্রিং উইথফর্ম্যাট: @ "স্ট্যাটাস:% @", (স্ট্যাটাসুল? @ "অনুমোদিত": @ "প্রত্যাখ্যান")] ... ... যা প্রিপ্রোসেসর ধ্রুবকগুলির জন্য দুর্দান্ত ব্যবহার: # ডিফাইন স্ট্যাটাসস্ট্রিং (স্ট্যাটাসবুল? @ "অনুমোদিত": @ "প্রত্যাখ্যানিত") ... ... তারপর: [এনএসএস স্ট্রিং উইথফোর্ম্যাট: @ "স্থিতি:% @", স্ট্যাটাস স্ট্রিং] এটি আপনাকে যদি অন্য কোনও ধরণগুলিতে স্থানীয় ভেরিয়েবলগুলি ব্যবহার ও প্রকাশ করা থেকে বাঁচায়। FTW এর!
ব্রুনো ব্রোনোস্কি

42
এটি সম্ভবত উল্লেখ করার মতো যে প্রথম উপাদান ( ?:) ব্যতীত টার্নারি অপারেটর এমন পরিস্থিতিতে আরও উন্নত যেখানে বাম দিকটি একটি অভিব্যক্তি, কারণ ?:এটি একাধিকবার মূল্যায়ন হতে বাধা দেয়। উদাহরণস্বরূপ: দু'বার [myArray firstObject] ? [myArray firstObject] : @"Hello World";কল firstObject(যদি firstObjectফিরে না আসে nil), যেখানে [myArray firstObject] ?: @"Hello World";অভিন্ন ফলাফল তৈরি করে তবে firstObjectএকবারে কখনও কল করে না ।
nhgrif

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

এছাড়াও এটি যুক্ত করতে চান যে গায়কটির সাথে ইমোজি সাদৃশ্যের কারণে প্রথম উপাদান ব্যতীত টার্নারি অপারেটরটিকে এলভিস অপারেটরও?: বলা হয় । এবং অবশ্যই এই ক্ষেত্রে আমরা একটি উপাদান বাদ দিচ্ছি, এটি আর কোনও টেরিনারি অপারেটর নয় তবে বাইনারি অপারেটর । বাইনারি অপারেটর অপারেটার আমরা সাধারণত (যখন প্রোগ্রামিং ব্যবহার বেশীরভাগ অন্তর্ভুক্ত , , , , , , , , ইত্যাদি)। *+-^|||&>>
tomacco

179

এটি টেরিনারি বা শর্তসাপেক্ষ অপারেটর। এটির মৌলিক ফর্মটি হ'ল:

condition ? valueIfTrue : valueIfFalse

যেখানে মানগুলি চয়ন করা হয় কেবল ততক্ষণ মূল্যায়ন করা হবে।


8
কেবল পরিষ্কার করার জন্য, এটি মানগুলির মধ্যে সীমাবদ্ধ নয়। condition ? codeIfTrue : codeIfFalse
মাইক এস

46

সহজভাবে, যুক্তি হবে

(condition) ? {code for YES} : {code for NO}


4
এটি আসলে সেরা উত্তর কারণ অন্যান্য উত্তরগুলি বোঝায় যে ফলস্বরূপ আপনার কেবল "মান" থাকতে পারে, যেখানে এটি দেখায় যে ফলস্বরূপ আপনি যেকোন স্বেচ্ছাসেবক কোড রাখতে পারেন।
মাইক এস

36

ব্যারি ওয়ার্কের দুর্দান্ত ব্যাখ্যাটির উপর ভিত্তি করে ...

টার্নারি অপারেটর সম্পর্কে যা গুরুত্বপূর্ণ তা হ'ল এটি এমন জায়গায় ব্যবহার করা যেতে পারে যেখানে যদি-অন্যথায় না পারে। অর্থাত: একটি শর্ত বা পদ্ধতির প্যারামিটারের ভিতরে।

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]

... যা প্রিপ্রসেসর ধ্রুবকগুলির জন্য দুর্দান্ত ব্যবহার:

// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]

এটি আপনাকে যদি অন্য পদ্ধতিতে স্থানীয় ভেরিয়েবলগুলি ব্যবহার ও প্রকাশ করা থেকে বাঁচায়। FTW এর!


14

এটি কেবলমাত্র সাধারণ টেরিনারি অপারেটর । যদি প্রশ্ন চিহ্নের আগের অংশটি সত্য হয়, তবে এটি কোলনের আগে অংশটি মূল্যায়ন করে এবং ফেরত দেয়, অন্যথায় এটি কোলনের পরে অংশটি মূল্যায়ন করে এবং ফেরত দেয়।

a?b:c

মত

if(a)
    b;
else
    c;

4

এটি সি এর অংশ, সুতরাং এটি উদ্দেশ্য-সি নির্দিষ্ট নয়। এখানে একটি ifবিবৃতিতে অনুবাদ করা হয়েছে:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

4

এটি যদি-তবে-অন্য বিবৃতি লেখার কেবল একটি ছোট ফর্ম। এর অর্থ নীচের কোডের মতোই:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;

2

টার্নারি অপারেটর উদাহরণ .যদি মহিলা বুলিয়ান ভেরিয়েবলের মান হ্যাঁ, তবে "জেন্ডার ইস FEMALE মহিলা" অন্যথায় "লিঙ্গার হ্যাঁ" মুদ্রণ করুন

? means = execute the codes before the : if the condition is true. 
: means = execute the codes after the : if the condition is false.

উদ্দেশ্য গ

BOOL isFemale = YES;
NSString *valueToPrint = (isFemale == YES) ? @"GENDER IS FEMALE" : @"GENDER IS MALE";
NSLog(valueToPrint); //Result will be "GENDER IS FEMALE" because the value of isFemale was set to YES.

সুইফ্টের জন্য

let isFemale = false
let valueToPrint:String = (isFemale == true) ? "GENDER IS FEMALE" : "GENDER IS MALE"
print(valueToPrint) //Result will be  "GENDER IS MALE" because the isFemale value was set to false.

2

মজাদার ঘটনা, উদ্দেশ্য-সিতে আপনি যদি নাল / নীল পরীক্ষা করতে চান তবে উদাহরণস্বরূপ:

-(NSString*) getSomeStringSafeCheck
{
    NSString *string = [self getSomeString];
    if(string != nil){
        return String;
    }
    return @"";
}

এটি করার দ্রুত উপায় হ'ল:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString] != nil ? [self getSomeString] : @"";
}

তারপরে আপনি এটিকে একটি সহজ উপায়ে আপডেট করতে পারেন:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString]?: @"";
}

কারণ উদ্দেশ্য-সি:

  1. যদি কোনও বস্তু শূন্য হয়, তবে এটি বুলেট হিসাবে মিথ্যা ফিরে আসবে;
  2. টার্নারি অপারেটরের দ্বিতীয় প্যারামিটারটি খালি থাকতে পারে, কারণ এটি 'এর বামে ফলাফলটি ফিরে আসবে?'

সুতরাং আপনি লিখুন বলতে দিন:

[self getSomeString] != nil?: @"";

দ্বিতীয় প্যারামিটারটি বুলিয়ান মানটি ফিরিয়ে দিচ্ছে, সুতরাং একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।


1

এটি তিনটি অপারেটর যেমন একটি / অন্য বিবৃতিটির মতো।

if(a > b) {
what to do;
}
else {
what to do;
}

টেরিনারি অপারেটরে এটি এমন: শর্ত? শর্তটি সত্য হলে কি করবেন: এটি মিথ্যা হলে কী করবেন;

(a > b) ? what to do if true : what to do if false;

2
আমি প্রশংসা করি যে আপনি সাইটে অবদানের চেষ্টা করছেন, তবে উত্তরগুলি পোস্ট করা যা উত্তরগুলি ইতিমধ্যে যা বলেছিল তা পুনরাবৃত্তি করে যা সাধারণভাবে নিরুৎসাহিত হয়, কারণ এটি কেবল প্রশ্নগুলিকে ছড়িয়ে দেয়।
ক্রিস হেইস

1

আমি সবেমাত্র টার্নারি অপারেটর সম্পর্কে নতুন কিছু শিখেছি। মাঝের অপারেন্ডকে বাদ দেওয়া সংক্ষিপ্ত রূপটি সত্যই মার্জিত এবং সি প্রাসঙ্গিক থাকার অনেকগুলি কারণের মধ্যে এটি একটি। এফওয়াইআই, আমি সি # তে প্রয়োগ করা একটি রুটিনের প্রসঙ্গে প্রথমে সত্যই আমার মাথাটা পেয়েছিলাম, যা এছাড়াও টার্নারি অপারেটরকে সমর্থন করে। যেহেতু ত্রৈমাসিক অপারেটর সি-তে রয়েছে, এটি যুক্তিতে দাঁড়িয়েছে যে এটি অন্যান্য ভাষায় হবে যা মূলত এটির এক্সটেনশন (যেমন, উদ্দেশ্য-সি, সি #)।


1

সবাই যেমন উল্লেখ করেছে যে এটি শর্তাধীন অপারেটরকে উপস্থাপন করার একটি উপায়

if (condition){ 
    true 
} 
else {
    false
}

টার্নারি অপারেটর ব্যবহার করে (condition)? true:false অতিরিক্ত তথ্য যুক্ত করতে, আমাদের কাছে সুইফটে এটি ব্যবহার করে প্রতিনিধিত্ব করার নতুন উপায় রয়েছে ??

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString

যা অনুরূপ

int a = 6, c= 5;
if (a > c) 
{ 
 a is greater
} else {
 c is greater
}

সমতুল্য

if (a>c)?a:c ==> এর সমান if (a>c)?:c

পরিবর্তে ?:আমরা ??দ্রুত ব্যবহার করতে পারেন ।


1
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

মানে

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.