21.4 조건식과 논리 연산자 사용하기

값뿐만 아니라 조건식 자체도 논리 연산자로 판단할 수 있습니다.

cond_exp_logical_operator.c

#include <stdio.h>
 
int main()
{
    int num1 = 20;
    int num2 = 10;
    int num3 = 30;
    int num4 = 15;
 
    printf("%d\n", num1 > num2 && num3 > num4);    // 1: 양쪽 모두 참이므로 참
    printf("%d\n", num1 > num2 && num3 < num4);    // 0: 앞만 참이므로 거짓
    
    printf("%d\n", num1 > num2 || num3 < num4);    // 1: 앞만 참이므로 참
    printf("%d\n", num1 < num2 || num3 < num4);    // 0: 양쪽 모두 거짓이므로 거짓
 
    printf("%d\n", !(num1 > num2));    // 0: 참의 NOT은 거짓
 
    return 0;
}

실행 결과

1
0
1
0
0

네 값을 두 값씩 묶어서 비교 연산자로 대소 관계를 비교한 뒤 논리 연산자로 참, 거짓을 판단하였습니다. 변수만 있으면 알아보기 어려우니 각 변수 값으로 바꿔서 살펴보겠습니다.

  • 20 > 10 && 30 > 15: 양쪽 모두 참이므로 AND 연산자의 결과는 참입니다.
  • 20 > 10 && 30 < 15: 20 > 10만 참이고, 30 < 15는 거짓이므로 AND 연산자의 결과는 거짓입니다.
  • 20 > 10 || 30 < 15: 20 > 10이 참이므로 OR 연산자의 결과는 참입니다.
  • 20 < 10 || 30 < 15: 양쪽 모두 거짓이므로 OR 연산자의 결과는 거짓입니다.
  • !(20 > 10): 참을 NOT 연산자로 뒤집었으므로 결과는 거짓입니다.

비교 연산자와 논리 연산자가 연달아서 나오면 알아보기가 어렵습니다. 따라서 다음과 같이 괄호를 사용하여 의도를 명확하게 나타내는 것이 좋습니다.

printf("%d\n", (num1 > num2) && (num3 > num4));
printf("%d\n", (num1 > num2) && (num3 < num4));

printf("%d\n", (num1 > num2) || (num3 < num4));
printf("%d\n", (num1 < num2) || (num3 < num4));

예를 들어 && 연산자는 19세 이상, 65세 미만을 가려낼 때 사용할 수 있습니다.

(age >= 19) && (age < 65)

age 변수가 19미만이면 첫 번째 조건을 만족하지 않으므로 단락 평가에 따라 두 번째 조건은 검사하지 않습니다.