2011-07-20 34 views
5

thể trùng lặp:
Double Negation in C++ code.Điều gì làm tăng gấp đôi (!!) được sử dụng trên biến không phải là boolean?

tôi đang làm việc với mã sản xuất mà tôi đã chạy ngang qua tuyên bố như thế này một vài lần:

Class.func(!!notABool); 

Cặp đôi đầu tiên của thời đại Tôi bác bỏ nó như là một programmer quirk (có thể để nhấn mạnh rằng nó là một tuyên bố có điều kiện chứ không phải là một số đang được pa ssed vào func?) nhưng tôi đã chạy qua một số báo cáo sử dụng ở trên và bây giờ tôi tự hỏi liệu nó thực sự làm cho một sự khác biệt hay không. Trong hầu hết các trường hợp notABool là một con số (int, float, double ... Tôi đã thấy tất cả 3) đoán ban đầu của tôi là nó là giống như gõ:

Class.func((bool)notABool); 

nhưng tôi không hoàn toàn chắc chắn?

+0

Đang chờ báo giá Donald Knuth trong 5 ... 4 ... 3 ... – Skizz

+0

@jonsca: Doh! Đã tìm kiếm tất cả các từ khác ngoại trừ từ chối. Đồng ý, đó là một bản sao. – Samaursa

+0

Không phải lo lắng. Tôi nghĩ rằng tiêu đề của bản sao là gây hiểu nhầm, nhưng nó xuất hiện trên danh sách "Liên quan" ----> – jonsca

Trả lời

4

Đối với các loại nguyên thủy, vâng, nó về cơ bản tương đương với:

!(notABool != 0) 

mà lần lượt tương đương với:

(bool)notABool 

Đối với các loại phi nguyên thủy, nó sẽ là một lỗi biên dịch, trừ khi bạn đã quá tải operator!, trong trường hợp đó, nó có thể làm bất cứ điều gì.

4

Có, chức năng nó chính xác giống như đang thực hiện (bool) notABool.

Theo định nghĩa, trong ngôn ngữ C++ các toán hạng của ! được ngầm chuyển đổi sang bool loại, vì vậy !!notABool thực sự là giống như !! (bool) notABool, ví dụ giống như chỉ (bool) notABool.

Trong ngôn ngữ C, !! là mẹo phổ biến để "chuẩn hóa" một biểu mẫu không có giá trị 1/0 thành 1/0. Trong C++ bạn chỉ có thể thực hiện (bool) notABool. Hoặc bạn vẫn có thể sử dụng !!notABool nếu bạn muốn.

2

Đó là thành ngữ cũ của C, có nghĩa là "chuẩn hóa thành 0 hoặc 1". Tôi không nghĩ rằng có một lý do để sử dụng nó trong C + + khác hơn là thói quen.

1

Chuyển đổi BOOL (xác định cho int) thành c + + bool. BOOL là một định nghĩa rằng trong một số trường hợp cho đúng có thể chứa các giá trị số nguyên khác nhau. Vì vậy, ví dụ BOOL a = (BOOL) 1; và BOOL b = (BOOL) 2; cả hai kiểm tra vượt qua cho đúng sự thật. Nhưng nếu bạn sẽ thử so sánh, bạn sẽ thấy rằng không bằng b. Nhưng sau khi chuyển đổi !! a bằng !! b.

(bool) notABoo - không phải là giống nhau, bởi vì bạn sẽ chuyển đổi loại biến byte vẫn sẽ có các giá trị khác nhau. !! chuyển đổi không chỉ loại mà trong một số trường hợp giá trị quá.

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