2012-01-17 27 views
15

thể trùng lặp:
Double Negation in C++ codeCách sử dụng "!!" là gì? (phủ nhận hai lần)?

Hãy nói rằng:

bool var = !!true; 

Nó sẽ gán "true" vào biến. Dường như vô dụng, nhưng tôi đã nhìn vào định nghĩa của Visual Studio về "khẳng định", và nó là:

#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)) 

Tại sao nó phủ nhận "_Expression" hai lần?

Tôi tự hỏi rằng họ muốn ép buộc "!" toán tử được gọi (trong trường hợp nó bị quá tải), nhưng điều đó dường như không phải là một lý do chính đáng.

+0

Câu hỏi hay, +1 – jlledom

+1

http://stackoverflow.com/questions/248693/double-negation-in-c-code – cnicutar

+0

http://stackoverflow.com/questions/1310344/why-use-when-converting -int-to-bool – cnicutar

Trả lời

7

!! đảm bảo rằng kết quả sẽ kết thúc dưới dạng 1 hoặc 0, thay vì chỉ giá trị _Expression hoặc 0. Trong C, không có vấn đề gì, nhưng trong C++ tôi nghĩ nó biến kết quả của biểu thức thành loại bool, có thể hữu ích trong một số trường hợp. Nếu bạn đã có một số API yêu cầu một chữ cái 1 hoặc 0 được chuyển cho nó, sử dụng !! sẽ là một cách để làm cho nó xảy ra.

1

Cách sử dụng của nó là đảm bảo giá trị bằng 0 hoặc 1. Tôi cho rằng giá trị này không cần thiết với kiểu bool của C++.

4

Có thể mà bạn có thể muốn có biến int là 1 hoặc 0.

Vì vậy, bạn không thể chuyển ví dụ 5, thay vào đó phủ định kép sẽ biến rằng 5 thành một số 1.

Ngoài ra, có một cái nhìn như thế nào TRUE được định nghĩa:

#ifndef TRUE 
#define TRUE    1 
#endif 

Vì vậy, một biểu hiện như:

int x = 5; 
if (x == TRUE) 
{ 
    //.... 
} 

sẽ không vượt qua, trong khi

if (x) 
{ 
    //.... 
} 

sẽ.

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