21.5 if 조건문과 논리 연산자 사용하기

이제 if 조건문에 논리 연산자를 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

if_logical_operator.c

#include <stdio.h>
 
int main()
{
    int num1 = 1;
    int num2 = 0;
 
    if (num1 && num2)      // num1과 num2가 모두 참인지 검사
        printf("참\n");
    else
        printf("거짓\n");  // num1만 참이므로 거짓이 출력됨
 
    if (num1 || num2)      // num1과 num2 둘 줄 하나가 참인지 검사
        printf("참\n");    // num1이 참이므로 참이 출력됨
    else
        printf("거짓\n");
 
    if (!num1)             // num1을 반대로 뒤집음
        printf("참\n");
    else
        printf("거짓\n");  // 참을 뒤집었으므로 거짓이 출력됨
 
    return 0;
}

실행 결과

거짓
참
거짓

변수에 10을 할당한 뒤 if 조건문 안에서 논리 연산자를 사용하였습니다. 여기서 num1에는 1, num2에는 0이 들어있으므로 AND 연산자의 결과는 거짓이며 OR 연산자의 결과는 참입니다. 또한, num1에 저장된 1을 뒤집었으므로 결과는 거짓입니다. 각자 변수에 다른 값을 넣어서 실행해보세요.

if 조건문에서 논리 연산자를 사용하면 단락 평가에 따라 동작이 결정됩니다. 다음 if 조건문에서 && 연산자는 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정하므로 else의 코드가 실행됩니다. 그리고 ||연산자는 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정하므로 if의 코드가 실행됩니다.

int num1 = 0;
int num2 = 1;

if (num1 && num2)       // 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정
    printf("참\n");
else
    printf("거짓\n");   // 거짓 출력

num1 = 1;
num2 = 0;
if (num1 || num2)     // 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정
    printf("참\n");   // 참 출력
else 
    printf("거짓\n");
참고 | 단락 평가의 활용

&& 연산자의 단락 평가를 활용하면 문제가 발생하는 코드를 미리 예방할 수 있습니다.

int num1 = 0;
int num2 = 10;

if ((num1 != 0) && (num2 / num1) < 20)    // num1이 0이면 나눗셈 연산을 하지 않음.
    printf("참\n");
else
    printf("거짓\n");

정수를 0으로 나누면 에러가 발생하지만 나눗셈 연산 전에 (num1 != 0) &&와 같이 num1이 0인지 검사하면 에러를 예방할 수 있습니다. 즉, && 연산자에서 첫번째 조건이 만족하지 않으면 두 번째 조건은 검사하지 않는 특성을 이용한 것입니다.

단락 평가는 논리 연산자로 된 조건 검사뿐만 아니라 사칙 연산 수행에도 적용됩니다.