वस्तुनिष्ठ-ग में प्रश्न चिह्न और बृहदान्त्र (?: टर्नरी ऑपरेटर) का क्या अर्थ है?


270

कोड की इस लाइन का क्या अर्थ है?

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

?और :मुझे भ्रमित।


1
यदि यह तत्कालीन संचालक है तो यह
टेर्नरी है

3
ध्यान दें कि यह प्रश्न चिह्न होना चाहिए, उद्धरण चिह्न नहीं।
क्लेहय

6
संकलक भी अनुमति देने लगता है variable ?: anotherVariable, इसका क्या मतलब है? '
टोनी

15
पहले तत्व के साथ त्रिगुट का अर्थ होता है(valOrVar != 0) ? valOrVar : anotherValorvar
स्कॉट लाहटेइन

जवाबों:


430

यह C टेनेरी ऑपरेटर है (ऑब्जेक्टिव-सी C का सुपरसेट है):

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

शब्दार्थ के बराबर है

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

पहले तत्व (जैसे variable ?: anotherVariable) के साथ त्रिगुट का अर्थ उसी के समान है(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(अद्यतन: यक! उत्तर के रूप में रिपॉस्टिंग)। टर्नरी ऑपरेटर के बारे में इतना महत्वपूर्ण क्या है कि इसका उपयोग उन जगहों पर किया जा सकता है जो एक-और नहीं कर सकते। यानी: एक शर्त या विधि पैरामीटर के अंदर। [NSString stringWithFormat: @ "Status:% @", (statusBool? @ "स्वीकृत": @ "अस्वीकृत") ... ... जो पूर्वप्रक्रमक स्थिरांक के लिए एक महान उपयोग है: #defineString (statusBool? @ "स्वीकृत": @) "रिजेक्टेड") ... फिर: [NSString stringWithFormat: @ "Status:% @", statusString] यह आपको और-और पैटर्नों में स्थानीय वेरिएबल्स के उपयोग और रिलीज होने से बचाता है। FTW!
ब्रूनो ब्रोंस्की

42
यह संभवतः ध्यान देने योग्य है कि पहले तत्व ( ?:) के बिना टर्नरी ऑपरेटर उन स्थितियों में भी बेहतर है जिसमें बाईं ओर एक अभिव्यक्ति है, क्योंकि ?:इसे एक से अधिक बार मूल्यांकन करने से रोकता है। उदाहरण के लिए: दो बार [myArray firstObject] ? [myArray firstObject] : @"Hello World";कॉल firstObject(यदि firstObjectनहीं लौटाता है nil), जहां [myArray firstObject] ?: @"Hello World";समान परिणाम उत्पन्न करता है लेकिन कभी firstObjectभी एक से अधिक बार कॉल नहीं करता है ।
नृगिफ़

अंत में ~~~~~ मैं उम्र के लिए इस ऑपरेटर का उपयोग कर रहा हूं (मेरे पसंदीदा डिफो) लेकिन कभी नहीं पता था कि इसे क्या कहा जाता है। बड़ा सवाल अब जवाब दे दिया गया है। धन्यवाद
थांग डू

यह भी जोड़ना चाहते हैं कि पहले तत्व के बिना टर्नरी ऑपरेटर को गायक के इमोजी के समान होने के कारण एल्विस ऑपरेटर?: भी कहा जाता है । और निश्चित रूप से इस मामले में जैसे हम एक तत्व को छोड़ रहे हैं, यह अब एक टर्नरी ऑपरेटर नहीं बल्कि एक बाइनरी ऑपरेटर है । द्विआधारी ऑपरेटरों ऑपरेटरों हम आम तौर पर (जब प्रोग्रामिंग का उपयोग के विशाल बहुमत शामिल , , , , , , , , आदि)। *+-^|||&>>
तंबाकू

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

यह C का हिस्सा है, इसलिए यह Objective-C विशिष्ट नहीं है। यहाँ एक ifकथन में अनुवाद है :

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

4

यह इफ़-तत्कालीन कथन लिखने का एक संक्षिप्त रूप है। इसका मतलब निम्नलिखित कोड के समान है:

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

2

टेनेरी ऑपरेटर उदाहरण। यदि इस प्रकार के बूलियन चर का मूल्य हां है, तो "GENDER IS FEMALE" को प्रिंट करें अन्यथा "GENDER IS MALE"

? 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

यह ternary ऑपरेटर है, जैसे कि if / else स्टेटमेंट।

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

टर्नरी ऑपरेटर में यह इस प्रकार है: स्थिति? अगर हालत सही है तो क्या करें: झूठे होने पर क्या करें;

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

2
मैं सराहना करता हूं कि आप साइट में योगदान करने का प्रयास कर रहे हैं, लेकिन उत्तर पोस्ट कर रहे हैं, जो केवल अन्य उत्तरों को पहले ही बताए गए हैं, जो कि आम तौर पर हतोत्साहित करते हैं, क्योंकि यह सिर्फ सवालों का जवाब देता है।
क्रिस हेस

1

मैंने टर्नरी ऑपरेटर के बारे में कुछ नया सीखा है। लघु रूप जो मध्य ऑपरेंड को छोड़ देता है वह वास्तव में सुरुचिपूर्ण है, और कई कारणों में से एक है जो सी प्रासंगिक है। FYI करें, मुझे पहली बार C # में लागू एक रूटीन के संदर्भ में इसके चारों ओर वास्तव में अपना सिर मिला, जो टर्नरी ऑपरेटर का भी समर्थन करता है। चूंकि टर्नरी ऑपरेटर सी में है, यह इस कारण से खड़ा है कि यह अन्य भाषाओं में होगा जो अनिवार्य रूप से एक्सटेंशन हैं (जैसे, ऑब्जेक्टिव-सी, सी #)।


1

जैसा कि सभी ने कहा कि, यह सशर्त ऑपरेटर का प्रतिनिधित्व करने का एक तरीका है

if (condition){ 
    true 
} 
else {
    false
}

ternary ऑपरेटर का उपयोग करना (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; 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.