[펌] !!a
최근 어느 오픈 소스를 살펴 보다가 a = !!b 와 같은 코드를 보게 되었습니다.
곰곰히 생각해보니... 그래도 도대체 왜 하는건지? -_-a
a와 b의 타입이 unsigned char라고 하면, 결국 a = !!b 는 a = b 인거잖아?
사실 일부 c와 같은 언어는 boolean 타입을 별도로 지원하지 않으므로,
2바이트의 char형을 이용하며, 엄밀히 boolean의 0 과 1 이라는 두가지 상태 그 이상의 것이 될 수도 있는 것이지요.
즉, b는 0 ~ 255 사이의 값이 될 수도 있으며
그래서 !!b는 b가 어떠한 값이든 간에 0이 아닌 이상 b의 값을 1로 바꾸어 줄 겁니다.
b 가 25 라고 가정할 때,
!b 는 0
!!b 는 1
오호...
그럼 a = !!b 대신 a = b를 이용했을 땐, 어떤 문제가 발생할 수 있을까?
#define TRUE 1 #define FALSE 0
typedef unsigned char BOOL;
BOOL sound_state = FALSE;
void set_sound_state( BOOL state ) { sound_state = state; }
BOOL get_sound_state() { return sound_state; }
void test() {
//사용자가 실수로 TRUE 대신 임의의 값을 집어 넣었습니다. //그런다고 해도 컴파일 오류는 안나고 심지어 컴파일 경고도 발생하진 않겠죠. set_sound_state( 123 );
//결국, 기대하던 OK는 출력될리가 없습니다. if( get_sound_state() == TRUE ) { printf("OK!\n"); }
} |
사용자는, 값이 있으면 TRUE이겠지 라고 충분히 착각할 수도 있습니다.
결국, 우리가 정의한 TRUE는 1이기 때문에 123 == 1 비교식에서 실패나겠죠.
따라서, 다음과 같이 수정을 해준다면
void set_sound_state( BOOL state ) { //심지어 state가 123 이어도 값을 1로 바꿔줍니다. sound_state = !!state; } |
'Tip & Tech' 카테고리의 다른 글
[펌] 기업에서까지 완전 무료 프로그램 - 진정한 FREE!! (0) | 2011.06.08 |
---|---|
[펌] 매크로 마법 (Macro) (2) | 2011.06.08 |
[펌] C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak ) (0) | 2011.06.08 |
[펌] 비주얼 스튜디오 _CrtDumpMemoryLeaks() 을 이용한 메모리 누수 탐지법 (0) | 2011.06.08 |
송창규, “unity build로 빌드타임 반토막내기”, Nexon Developer Conference, May 2010 (0) | 2011.05.30 |