2013-04-24 54 views
30

Tôi có một số mã C++ sử dụng rộng rãi !!. Tôi hơi bối rối vì theo như tôi biết, !! không phải là nhà khai thác trên chính nó mà là hai ! sau mỗi khác. Điều đó có nghĩa là !!foo cũng giống như chỉ foo.Bối rối bằng cách sử dụng toán tử logic không phải (!!)

Có bất kỳ địa điểm và lý do nào khi !! thực sự có ý nghĩa không? Tôi đã suy nghĩ về nó nếu nó có lẽ có một chút ý nghĩa khôn ngoan? Vì vậy, trước tiên bạn thực hiện một số hoạt động khôn ngoan một chút trên foo và sau đó ! về kết quả? Nhưng tôi dường như không nhớ ! được sử dụng như một nhà điều hành khôn ngoan chút và dường như không tìm thấy bất kỳ tài liệu tham khảo nói với tôi nó là một trong hai. Theo như tôi có thể nói ! ở chỉ được sử dụng như một nhà điều hành hợp lý và trong trường hợp đó

!!foo == foo

+4

Bạn cũng có thể viết 'x +++++ y + 1', nhưng đó là một ý tưởng tồi. – msw

+0

@GrahamBorland Bây giờ tôi sẽ đi qua đó và bỏ phiếu đó như là một bản sao của điều này. –

+0

Bạn cũng có thể muốn đọc nội dung này: [* what is !! trong c? *] (http://stackoverflow.com/questions/14751973/what-is-in-c?lq=1). –

Trả lời

45

Nó không đơn giản như phủ định kép. Ví dụ, nếu bạn có x == 5, và sau đó áp dụng hai! các toán tử (!!x), nó sẽ trở thành 1 - vì vậy, nó được sử dụng để bình thường hóa các giá trị boolean trong phạm vi {0, 1}.

Lưu ý rằng bạn có thể sử dụng số không là boolean false và khác 0 cho boolean true, nhưng bạn có thể cần phải chuẩn hóa kết quả của mình thành 0 hoặc 1 và đó là khi !! hữu ích.

Nó giống như x != 0 ? 1 : 0.

Ngoài ra, lưu ý rằng điều này sẽ không thể đúng nếu foo không có trong {0, 1} thiết lập:

!!foo == foo

#include <iostream> 

using namespace std; 

int main() 
{ 
     int foo = 5; 

     if(foo == !!foo) 
     { 
       cout << "foo == !!foo" << endl; 
     } 
     else 
     { 
       cout << "foo != !!foo" << endl; 
     } 



     return 0; 
} 

Prints foo != !!foo.

+2

Ahhh thanx ... Điều đó có ý nghĩa hoàn hảo – inquam

+0

trường hợp có thể là trường hợp sử dụng có thể cho điều này? –

+3

Giả sử bạn có một số nơi mà một bool được lưu trữ như là 1 hoặc 0, trong một chút hoặc một cái gì đó. Và giá trị mà bạn kiểm tra ngược lại là 5 (mà sẽ được tính là đúng), về cơ bản bạn có thể biến số 5 thành 1. – inquam

4

nếu foo != 0, sau đó !!foo == 1. Về cơ bản nó là một mẹo để chuyển đổi sang bool.

+1

'1' không phải là một' bool'. Đó là một 'int'. –

+1

@Kerrek SB Tôi biết, tôi đang đề cập đến giá trị thực tế. –

8

Nó có thể được sử dụng như viết tắt để biến foo thành biểu thức boolean. Bạn có thể muốn biến một biểu thức phi boolean thành true hoặc false chỉ vì một lý do nào đó.

foo = !!foo sẽ chuyển foo thành 1 nếu không khác và để ở số 0 nếu đã có.

3

Nếu foo không thuộc loại bool, thì !!foo sẽ là. Vì vậy, !!foo có thể là 1 hoặc 0.

+0

'0' và' 1' là 'int', không phải 'bool'. Chúng ta đang nói về C++ ở đây; có lẽ bạn đang bối rối với C? –

+0

Bạn nói đúng. Tôi nên nói đúng hay sai. :) –

1

Kỹ thuật này được sử dụng để đánh giá an toàn biến trong ngữ cảnh boolean. Nếu bạn có một cuộc trò chuyện bình thường để bool (operator bool()) biến không liên quan (với các loại differnt) có thể tham gia vào các biểu thức boolean một cách không mong muốn. Một defintion của operator! mà trả về một giá trị boolean phủ định được thực hiện. Và kết quả của nó phải được phủ nhận một lần nữa. Đơn giản chỉ cần nhìn vào Safe bool idiom.