I was just reading the definition of assert in assert.h and basically it was this :

Code:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
My question is why are there 2 ! operators ? isn't that the same as saying

Code:
#define assert(_Expression) (void)( (_Expression) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
Sorry if this was a stupid question, but it was just confusing me. Thanks!