2012-02-24 26 views
6

Trong các ý kiến ​​ở đây - https://stackoverflow.com/a/9393138/8047 - Tôi phát hiện ra rằng BOOL có một số hành vi không mong muốn khi đặt giá trị của nó từ giá trị int. Chủ yếu, nếu giá trị được đặt thành 0x1000, giá trị đó được đánh giá là FALSE (đáng ngạc nhiên).Ngụ ý của các giá trị int không “phù hợp” - bool hoặc BOOL cho mục tiêu-C?

NSLog(@"All zero? %d %d", (BOOL)0, (bool)0); 
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits 
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097); 

Produces: 
All zero? 0 0 
All one? -1 0 1 
All one? 1 1 1 

Tôi nghĩ rằng đây là số lẻ, nhưng sau đó một lần nữa, tôi không đúc từ int để BOOL nhiều anyway. Tuy nhiên:

  1. Điều này có nghĩa là bool được ưu tiên là BOOL? Tại sao hay tại sao không?
  2. Is it okay để sử dụng

if (thatBool) {

        hay người ta phải thích

if (thatBool ? YES : NO) {

    Và tại sao?

Lưu ý: Đây là phiên bản cụ thể hơn về câu hỏi này - Objective-C : BOOL vs bool - nhưng tôi nghĩ nó thêm vào nó và không trùng lặp.

Trả lời

3

Tôi nghĩ rằng (BOOL)4096 đang được đánh giá để 0 là một lỗi tràn số học đơn giản, giống như (BOOL)256, vì BOOL là một unsigned char. Và tôi nghĩ rằng !! đúc lừa ("đôi phủ định") hoạt động tốt:

NSLog(@"%i", (BOOL)256); // 0 
NSLog(@"%i", !!256); // 1 

Điều đó có nghĩa tôi muốn sử dụng BOOL để giữ tiêu chuẩn phong cách Cocoa mã hóa và chỉ đơn giản là xem cho loại nguy hiểm phôi. Biểu hiện thatBool ? YES : NO làm đau mắt tôi, tại sao bạn muốn làm điều đó? :)

+0

Bất kỳ liên kết nào trên mẹo đúc '!!'? Những điều này hơi khó tìm kiếm :) –

+0

Đó là một [hai phủ định] đơn giản (http://www.google.com/search?q=c+double+negation), việc tìm kiếm sẽ dễ dàng hơn. – zoul

+0

Cảm ơn @zoul, vâng đủ dễ dàng. Tôi nghĩ rằng 'xem cho các loại phôi nguy hiểm' là đúng. –

2

1) bool là loại C++, BOOL là mục tiêu C. Đúc từ int đến BOOL không hoạt động bình thường vì YES chỉ là (BOOL)1 = (signed char)1 (= 0x001) và điều đó không bằng (signed char)4 (= 0x100).

2) Cả hai đều sẽ hoạt động, thứ hai có thể không đọc được đối với ai đó có ít kinh nghiệm lập trình. Tôi thích kiểm tra tình trạng an toàn kiểu c cũ tốt với hằng số ở bên trái để ngăn chặn tình trạng thiếu sót vô tình của một trong những dấu hiệu bằng nhau.

if (YES == isEnabled) { 

} 
+2

Chỉ cần thêm rằng "if (thatBool?CÓ: KHÔNG) {"là vô ích, chỉ là một nếu bên trong một if (ifception!), Đó là điều tương tự. – fbernardo

+1

Tôi thích Yoda nếu phong cách, tôi luôn luôn tưởng tượng rằng các lập trình viên thực sự nói như thế này và nó chỉ vui nhộn :) – JustSid

+0

Và nó rất thực tế, thực sự: -D – Alexander

0

Khi sử dụng int, bạn luôn có thể rõ ràng khi đặt BOOL bằng cách kiểm tra xem int có bằng một giá trị cụ thể hay không, ví dụ:

BOOL yesNo = ((int)4096 > 0); 
BOOL enableButton = (someInt >= 16); 

Nói cách khác, không chuyển trực tiếp cho BOOL; biến nó thành câu lệnh đúng/sai.

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