if (!expr)
이렇게 하면 표현식 expr이 참이 아닐 때...라고 배웠습니다.
그럼
if (!!expr)
이건 어떤 의미일까요?
단순히 표현식 expr이 참일 때... 일까요?
물론 참일 때이죠...
그럼
if (expr)
과
if (!!expr)
이것은 같은 결과일까요?
같은 결과가 아니랍니다. 최소한 Visual C++에서는 말이죠...
(다른 컴파일러도 마찬가지 일 것 같습니다.)
Visual Studio 2010의 crtdbg.h 헤더 파일에 보면 아래와 같이 되어 있습니다.
여기에 설명이 나와 있네요.
/* Asserts */
/* We use !! below to ensure that any overloaded operators used to evaluate expr do not end up at operator || */
#define _ASSERT_EXPR(expr, msg) \
(void) ((!!(expr)) || \
(1 != _CrtDbgReportW(_CRT_ASSERT, _CRT_WIDE(__FILE__), LINE, NULL, msg)) || \
(_CrtDbgBreak(), 0))
이런 것은 한번도 고려하지 못했는데... 물론 이런 게 필요한 경우도 없었구요.
시스템 라이브러리를 만드는 사람들은 저런 것도 고민해야 되니 참 머리 아프겠어요.

by BSPFP