Dấu hỏi và dấu hai chấm (?: Toán tử ternary) có nghĩa gì trong mục tiêu-c?


270

Dòng mã này có ý nghĩa gì?

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

Các ?:nhầm lẫn tôi.


1
Đó là nhà điều hành if-then-
other

3
Lưu ý rằng đây phải là dấu hỏi, không phải dấu ngoặc kép.
clahey

6
Trình biên dịch dường như cũng cho phép variable ?: anotherVariable, điều này có nghĩa là gì? '
Tony

15
(valOrVar != 0) ? valOrVar : anotherValorvar
Chim nhạn

Câu trả lời:


430

Đây là toán tử ternary C (Objective-C là siêu bộ của C):

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

tương đương về mặt ngữ nghĩa với

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

Ternary không có phần tử đầu tiên (ví dụ variable ?: anotherVariable) có nghĩa giống như(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(cập nhật: Yuck! Đăng lại như một câu trả lời.) Điều quan trọng về toán tử ternary là nó có thể được sử dụng ở những nơi mà if-other không thể. tức là: Bên trong một tham số điều kiện hoặc phương thức. [NSString chuỗiWithFormat: @ "Status:% @", (statusBool? @ "Đã phê duyệt": @ "Bị từ chối")] ... đó là một cách sử dụng tuyệt vời cho các hằng số tiền xử lý: #define statusString (statusBool? @ "Đã phê duyệt": @ "Đã từ chối") ... sau đó: [NSString chuỗiWithFormat: @ "Status:% @", statusString] Điều này giúp bạn không phải sử dụng và giải phóng các biến cục bộ trong các mẫu if-if. FTW!
Bruno Bronosky

42
Có lẽ đáng nói đến là toán tử ternary không có phần tử đầu tiên ( ?:) thậm chí còn tốt hơn trong các tình huống trong đó phía bên trái là một biểu thức, vì ?:điều đó ngăn nó được đánh giá nhiều lần. Ví dụ: [myArray firstObject] ? [myArray firstObject] : @"Hello World";gọi firstObjecthai lần (nếu firstObjectkhông trả về nil), trong đó [myArray firstObject] ?: @"Hello World";tạo ra kết quả giống hệt nhau nhưng không bao giờ gọi firstObjectnhiều hơn một lần.
nhgrif

cuối cùng ~~~~~ Tôi đã sử dụng toán tử này từ lâu (mặc định yêu thích của tôi) nhưng không bao giờ biết nó được gọi là gì. câu hỏi lớn đã được trả lời Cảm ơn
Thang Đỗ

Cũng muốn thêm rằng toán tử ternary không có phần tử đầu tiên ?:cũng được gọi là toán tử Elvis do biểu tượng cảm xúc giống với ca sĩ. Và tất nhiên trong trường hợp này khi chúng ta bỏ một phần tử, nó không còn là toán tử ternary mà là toán tử nhị phân . Khai thác nhị phân bao gồm đại đa số các nhà khai thác chúng ta thường sử dụng khi lập trình ( *, +, -, ^, |, ||, &, >>, vv).
tomacco

179

Đó là toán tử ternary hoặc điều kiện. Hình thức cơ bản của nó là:

condition ? valueIfTrue : valueIfFalse

Trường hợp các giá trị sẽ chỉ được đánh giá nếu chúng được chọn.


8
Chỉ cần làm rõ, nó không giới hạn giá trị. condition ? codeIfTrue : codeIfFalse
Mike S

46

Đơn giản, logic sẽ là

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


4
Đây thực sự là câu trả lời tốt nhất vì các câu trả lời khác ngụ ý rằng bạn chỉ có thể có "giá trị", trong khi điều này cho thấy rằng bạn có thể đặt bất kỳ mã tùy ý nào.
Mike S

36

Dựa trên lời giải thích tuyệt vời của Barry Wark ...

Điều quan trọng về toán tử ternary là nó có thể được sử dụng ở những nơi mà nếu không thì không thể. tức là: Bên trong một tham số điều kiện hoặc phương thức.

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

... đó là một cách sử dụng tuyệt vời cho các hằng tiền xử lý:

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

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

Điều này giúp bạn không phải sử dụng và giải phóng các biến cục bộ trong các mẫu if-other. FTW!


14

Đó chỉ là toán tử ternary thông thường . Nếu phần trước dấu chấm hỏi là đúng, nó sẽ đánh giá và trả về phần trước dấu hai chấm, nếu không, nó sẽ đánh giá và trả về phần sau dấu hai chấm.

a?b:c

giống như

if(a)
    b;
else
    c;

4

Đây là một phần của C, vì vậy nó không phải là Objective-C cụ thể. Đây là một bản dịch thành một iftuyên bố:

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

4

Nó chỉ là một hình thức ngắn để viết một câu lệnh if-then-other. Nó có nghĩa giống như mã sau đây:

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

2

Ví dụ về toán tử ternary. Nếu giá trị của biến boolean isF Gay là CÓ, hãy in "GENDER IS FEMALE" nếu không "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.

Mục tiêu-C

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.

Dành cho Swift

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

Thực tế thú vị, trong object-c nếu bạn muốn kiểm tra null / nil Ví dụ:

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

Cách nhanh chóng để làm điều đó là:

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

Sau đó, bạn có thể cập nhật nó theo cách đơn giản nhất:

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

Bởi vì trong Mục tiêu-C:

  1. nếu một đối tượng là 0, nó sẽ trả về false là boolean;
  2. Tham số thứ hai của Toán tử Ternary có thể trống, vì nó sẽ trả về kết quả ở bên trái của '?'

Vì vậy, hãy nói rằng bạn viết:

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

tham số thứ hai đang trả về giá trị boolean, do đó, một ngoại lệ được đưa ra.


1

Nó là toán tử ternary, giống như một câu lệnh if / other.

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

Trong toán tử ternary nó là như thế: điều kiện? Phải làm gì nếu điều kiện là đúng: phải làm gì nếu nó sai;

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

2
Tôi đánh giá cao việc bạn đang cố gắng đóng góp cho trang web, nhưng việc đăng các câu trả lời đơn giản lặp lại những gì các câu trả lời khác đã nêu thường không được khuyến khích, vì nó chỉ làm xáo trộn các câu hỏi.
Chris Hayes

1

Tôi vừa học được một cái gì đó mới về toán tử ternary. Các hình thức ngắn mà bỏ qua toán hạng giữa là thực sự thanh lịch, và là một trong nhiều lý do mà C vẫn còn có liên quan. FYI, lần đầu tiên tôi thực sự hiểu được vấn đề này trong bối cảnh một thói quen được thực hiện trong C #, cũng hỗ trợ nhà điều hành ternary. Vì toán tử ternary nằm trong C, nên có lý do rằng nó sẽ ở các ngôn ngữ khác về cơ bản là các phần mở rộng của chúng (ví dụ: Objective-C, C #).


1

Như mọi người đã đề cập, đó là một cách đại diện cho toán tử có điều kiện

if (condition){ 
    true 
} 
else {
    false
}

bằng cách sử dụng toán tử ternary (condition)? true:false Để thêm thông tin bổ sung, trong swift chúng tôi có cách biểu diễn mới bằng cách sử dụng nó ??.

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

Tương tự như

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

tương đương với

if (a>c)?a:c ==> Bằng với if (a>c)?:c

thay vì ?:chúng ta có thể sử dụng ??là nhanh chóng.


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

có nghĩa

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.