int _tmain(int argc, _TCHAR* argv[]) { int a = -3; unsigned int b = 2; if ( b + a < 0) { cout<<"hello"<<endl; } else { cout<<"world"<<endl; } return 0; }
무조건 world 가 출력된다. vs2010 에서는 warning level 4 설정을 하더라도 경고는 출력되지 않는다. 언어의 명세라서 경고에 넣지 않은 듯. (명세 이름이 암시적 타입 변환이라니 OTL ‘명세’와 ‘암시’는 안 어울린다고…) a 가 unsigned int 로 promotion 되는 것이 원인.
위의 문제는 잘 들어나지 않다가 약간의 수정으로 발생할 수 있다. 6번 라인이 원래 b + a == -1 였다면 기대한 대로 hello 가 출력된다.
좀 더 자세한 것은 The C++ Programming Language 부록 C 6.1, C 6.3 을 보자. C의 경우는 C99 Standard 6.3.1.8을 보자.
유사한 디버깅 사례로 민장님 블로그1를 참고하자.