Tip & Tech

[펌] !!a

blueasa 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

반응형