18.4 if 조건문의 동작 방식 알아보기

C 언어에서 if는 0일 때 거짓, 0이 아닐 때 참으로 동작합니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

if_2.c

#include <stdio.h>
 
int main()
{
    if (2)    // 0이 아니므로 참
        printf("참\n");
    else
        printf("거짓\n");
 
    return 0;
}

실행 결과

if2를 넣었는데도 "참"이 출력됩니다. 즉, -4, -3, -2, -1, 1, 2, 3, 4...처럼 0이 아닌 양수와 음수를 넣으면 무조건 참입니다. 실수도 마찬가지로 0.0f는 거짓이며 0.0f가 아닌 값들은 참입니다. 각자 0이 아닌 다양한 양수와 음수를 넣어보세요.

이번에는 0을 넣어봅니다.

if_0.c

#include <stdio.h>
 
int main()
{
    if (0)    // 0이므로 거짓
        printf("참\n");
    else
        printf("거짓\n");
 
    return 0;
}

실행 결과

거짓

다른 숫자는 모두 참이지만 0만 거짓입니다. 따라서 "거짓"이 출력됩니다. 최근에 나온 언어는 true(참), false(거짓)과 같은 전용 자료형을 가지고 있지만 C 언어는 0을 거짓으로, 그 이외의 값을 모두 참으로 사용합니다.

C 언어를 처음 배우고 나면 다음과 같이 if의 조건식 안에서 = (할당 연산자)를 사용하는 실수를 꽤 하게 됩니다.

if_assign.c

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 = 10)    // num1에 10을 할당. 0이외의 숫자는 참이므로 10은 참
        printf("10입니다.\n");
 
    return 0;
}

실행 결과

10입니다.

if의 조건식에 num1 = 10처럼 지정해버리면 num110이 할당(저장)되고, ifnum1에 들어있는 값 대로 조건을 판단하게 됩니다. 따라서 10은 0이외의 값이라 참이므로 "10입니다."가 출력됩니다. 만약 조건식을 num1 = 0로 지정하면 0은 거짓이므로 아무것도 출력되지 않습니다.

그림 18‑3 조건식과 할당 연산자

조건식에 ==대신 =를 사용하는 실수는 보통 컴파일 에러가 나지 않으므로 잡아내기가 힘들고, 코드가 복잡해지면 눈에 잘 띄지 않습니다. 조건식을 사용할 때는 이 부분을 항상 주의합니다.

참고 | 조건식의 =와 컴파일 옵션

Visual Studio나 GCC의 컴파일 옵션에서 기본 경고 수준은 if에서 =를 사용해도 경고를 발생시키지 않습니다.

조건식에서 =를 사용했을 때 경고를 발생시키려면 다음과 같이 설정해주면 됩니다.

  • Visual Studio: 솔루션 탐색기에서 프로젝트 선택하고, 마우스 오른쪽 버튼을 클릭하면 팝업 메뉴가 나옵니다. 속성(R) > C/C++ > 일반 > 경고수준수준4(/W4) 이상으로 설정
if_assign.c(7): warning C4706: 조건식 내에 할당이 있습니다.
  • GCC: 명령줄 옵션에서 -Wparentheses를 지정합니다.
gcc if_assign.c -Wparentheses
if_assign.c: In function ‘main’:
if_assign.c:7:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if (num1 = 10)
     ^

컴파일 옵션을 설정 한 뒤 이런 경고가 보이면 자신이 실수를 하지 않았는지 확인해보세요.

참고 | 실수를 방지하는 코드?

다른 사람이 만든 소스 코드를 보다 보면 다음과 같이 if의 조건식에서 변수와 값이 반대로 지정된 것을 볼 수 있습니다.

if (10 == num1)
    printf("10입니다.\n");

조건식에서 비교할 값을 앞에 두면 if에서 =를 사용했을 때 에러가 발생하므로 실수를 방지할 수 있기 때문입니다.

if (10 = num1)    // 10에 num1을 할당(저장)할 수 없으므로 컴파일 에러
    printf("10입니다.\n");
if_assign.c(7): error C2106: '=': 왼쪽 피연산자는 l-value이어야 합니다.

10은 리터럴이므로 값을 할당(저장) 할 수 없는 특성을 이용한 것이죠.