2012-07-11 28 views
20

Có cách nào để đặt điều kiện trả về true nếu một trong hai thành phần trả về đúng không?XOR Objective-c

BOOL var1 
BOOL var2 

một cái gì đó ngắn hơn if((var1 && !var2) || (!var1 && var2))

Cảm ơn bạn

+7

bạn có thể sử dụng if (var1 var2 ^) – Siddiqui

Trả lời

54

Như Objective-C là một superset của C, bạn chỉ cần sử dụng toán tử XOR từ C, đó là ^.

+18

Đó là Bitwise XOR, nếu bạn muốn có một XOR logic, chỉ cần sử dụng '! ='. –

+2

Cả hai giải pháp sẽ không hoạt động mọi lúc. BOOL có thể là bất kỳ số nguyên nào. Cả hai sẽ thất bại nếu cả hai giá trị khác 0, nhưng không bằng nhau. Tùy chọn mạnh mẽ nhất có lẽ là viết ra đầy đủ, như câu hỏi ban đầu. –

+1

@DrewMcCormack, để tránh sự cố này, bạn có thể chuyển đổi bất kỳ loại nào thành 'BOOL' thực bằng hai dấu chấm than. '!! var1! = !! var2' – DanSkeel

42

XOR

if(!!var1 != !!var2) 
{ 
    NSLog(@"XOR condition"); 
} 

dấu Exclamation chuyển đổi vars để BOOL (chuyển đổi thực sự, không đúc)
Vì vậy, giải pháp này hoạt động ngay cả khi các biến của bạn không phải là BOOL.

!!(0|nil) ≡ 0 
!!(any other number|object) ≡ 1 

Điều này rất hữu ích trong trường hợp bạn muốn chắc chắn rằng chỉ một trong các thùng là không phải.

+0

ngắn, thanh lịch, dễ dàng và đơn giản – meronix

+0

Theo mặc định, biến BOOL là NO. Trong tình trạng này, tôi nghĩ nó thất bại. Kiểm tra nó –

+0

Tôi thích cái này btw nhưng cà rốt có thể mang tính học thuật hơn nhờ câu trả lời –

0

thử (int)var1^(int)var2 YES và NO đang thực sự được xác định như sau:

#define YES (BOOL)1 
#define NO (BOOL)0 
0
if ((!var1)==var2) 
{ 
     NSLog(@"Yes"); 
} 
3

Bạn có thể bổ sung thêm rõ nét để mã mà Ishu gợi ý bằng cách làm này:

#define XOR != 

và sau đó bạn chỉ cần viết:

if (var1 XOR var2) { 

    ... 
} 

bảng thật ra:
[T XOR T => F; T! = T => F],
[T XOR F => T; T! = F => T],
[F XOR T => T; F! = T => T] và
[F XOR F => F; F! = F => F]

+0

Đây không phải là xor –

+0

@AlbertRenshaw Có, bởi vì nó dẫn đến cùng một bảng chân lý: [T XOR T => F; T! = T => F], [T XOR F => T; T! = F => T], [F XOR T => T; F! = T => T] và [F XOR F => F; F! = F => F]. –

+1

Woah bạn nói đúng. Tôi thực sự cảm thấy rất ngu ngốc vì không nhận ra điều này! Cảm ơn vì đã dạy tôi –

2

Macro có thể là một tùy chọn. Nó sẽ giữ cho hành vi tương tự, nhưng bây giờ theo một cách dễ đọc hơn.

#define XOR(x,y) (((x) && !(y)) || (!(x) && (y)))

if(XOR(var1, var2) { 

} 
Các vấn đề liên quan