Link

대입문 사용시 주의해야 할 점

우리는 때때로 함수로부터 반환된 값을 변수에 저장하는 동시에 특정 ㄱㅄ과 비교하는 코드를 (직접 작성하든 다른 사람이 작성한 코드를 읽게 되든)접하게 된다. 예를 들어 다음과 같은 코드는

#include <stdio.h>

int main(void)
{
        int c;

        c = getchar();
        while (c != EOF) {
                putchar(c);
                c = getchar();
        }
        printf("EOF: %d\n", EOF);
        return 0;
}

다음과 같은 코드로 단축할 수 있다.

#include <stdio.h>

int main(void)
{
        int c;
        while ((c = getchar()) != EOF) {
                putchar(c);
        }
        return 0;
}

while ((c = getchar()) != EOF) 와 같이 대입과 동시에 비교하는 코드는 매우 편리하지만 대입 연산자(=)보다 비교 연산자(!=, ==, >, <, >=, <=)가 우선순위가 높다는 점을 주의하지 않으면 엉뚱한 결과를 초래할 수 있다.

방금 본 문장에서 괄호를 제거하여 while (c = getchar() != EOF) 라고 쓰면 = 연산자보다 != 연산자의 우선순위가 높기 때문에 while (c = (getchar() != EOF)) 라고 해석된다. 이 코드에서 c에는 getchar()의 반환값이 저장될 거라는 기대와 달리 getchar()의 반환값과 파일의 끝을 나타내는 상수 EOF를 비교한 결과가 저장된다. 그래서 c에는 입력된 문자가 아니라 참과 거짓을 나타내는 1 또는 0이 저장된다.