블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

[펌] !!a

Tip & Tech / 2011. 6. 8. 01:41

최근 어느 오픈 소스를 살펴 보다가 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;

}

 

자, 이제 만사 OK!


[출처]
 !!a|작성자 Hermet

반응형
Posted by blueasa
, |