개발을 한지 어느새 5년이상의 시간이 지났지만, 아직까지도 개발의 영역이 끝도 없다는 생각을 한다. 

부끄럽지만 개발하면서 실수하거나 코드리뷰에서 수행했던 내용들을 하나둘 정리해보고자 한다. 

 

아래는 코드리뷰를 수행하며 안타깝게 놓쳤던 내용을 정리한 것이다.  

 

아래와 같이 1~9 사이의 숫자 중 2번째 BIT값이 1인 값을 찾을 때, 아래와 같이 코딩을 하였다.

 

 

int main()
{
    // 1~9사이의 숫자 중 2번째 Bit값이 1인 값을 찾는다고 가정한다. 
    for (unsigned int i = 0; i < 10; ++i)
    {
        if (i & 2 == 2)
        {
            std::cout << i << "는 2번째 Bit가 1입니다.\n ";
        }
    }
}

/*
기대값 : i = (2, 3, 6, 7) 일때 구문이 출력될 것이다. 
1  = 0001(2)
2  = 0010(2) --> *
3  = 0011(2) --> *
4  = 0100(2)
5  = 0101(2)
6  = 0110(2) --> *
7  = 0111(2) --> *
8  = 1000(2)
9  = 1001(2)
*/

그러나 실제 실행결과는 전혀 예상하지 못한 값이 나왔다.

실제 실행결과

왜 이런 결과가 발생했을까?

답은 연산자의 우선순위에 있었다.

비트 AND 연산(&) 보다 같음 연산(==)이 연산의 우선순위가 높다.  

따라서 위의 코드는 아래와 같이 해석될 수 있다. 

int main()
{
    // 1~9사이의 숫자 중 2번째 Bit값이 1인 값을 찾는다고 가정한다. 
    for (unsigned int i = 0; i < 10; ++i)
    {
        /* 2==2가 &보다 우선하기 때문에 2=2의 결과인 1(True)가 먼저 계산된다. 
        이후 i & 1 이 계산되므로, 첫번째 Bit가 존재할 때 반환값이 1이 반환된다. (ERROR)*/
        if (i & 2 == 2) 
        {
            std::cout << i << "는 2번째 Bit가 1입니다.\n ";
        }
    }
}

 

연산자의 우선순위에 대해 생각하지 못하면, 위와 같은 치명적인 실수가 발생할 수 있다.

아래는 Microsoft에서 제공한 C연산자의 우선순위표이다. 

 

+ Recent posts