논리 연산자

정의

  • 불 값(boolean value)를 대상으로 참, 거짓을 구하는 연산자
  • 즉, 피연산자가 불 값이다.

종류

연산자 기능 사용 예
&& 논리곱 (AND) a && b
|| 논리합 (OR) a || b
! 부정 (NOT) !a

논리곱과 논리합은 기호를 두 개연속으로 사용한다.
뒤에서 살펴볼 비트 연산은 동일한 기호를 한 개만 사용하는데..
이렇게 기억할 수도 있다.
“논리 연산자는 논리를 연산하는 &( 혹은 |) 하나와, 단축연산 여부를 검사하는 검사자 &(혹은 |) 하나가 붙어 두 개로 표현한다.”
정설이 아니라, 그냥 기억하기 위한 방법이다.

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void logical_operation(){
    // && : 논리곱 (AND : 두 가지 모두 참이어야 참)
    if ((8 > 3) && (9 < 2) ) println("(1) both are true");
    else println("(1) someone is false");
    if ((8 > 3) && (9 > 2) ) println("(2) both are true");
    else println("(2) someone is false");

    // || : 논리합 (OR : 둘 중 하나라도 참이면 참)
    if ((8 > 3) || (9 > 2) ) println("(1) both are true");
    if ((8 > 3) || (9 < 2) ) println("(2) someone is true");
    if ((8 < 3) || (9 < 2) ) println("(3) both are false");

    // ! : 부정 (NOT : 단항연산, 참->거짓 / 거짓->참)
    int a = 2 > 1;
    printf("a : %d\n", a);
    printf("not a : %d\n", !a);
}
1
2
3
4
5
6
7
8
9
10
11
12
# 논리곱
(1) someone is false # 둘 중 하나 거짓 --> false 부분 출력
(2) both are true    # 모두 참 --> true 부분 출력

# 논리합
(1) both are true    # 둘 다 참 --> ture
(2) someone is true  # 둘 중 하나 참 --> true
                     # 둘 다 거짓 --> 출력되지 않음

# 부정
a : 1       # 참
not a : 0   # 거짓

단축 연산

정의

  • 논리 연산 과정에서 참이나 거짓이 확정되면, 논리식의 나머지 부분은 실행하지 않는 특성
  • 단축 연산으로 인한 아래와 같은 장점들이 있다.
  • (1) 불필요한 연산을 하지 않음
  • (2) 나머지 피연산자 수식으로 인한 오류도 방지할 수 있다.

AND 연산에서의 단축 연산

  • 좌측의 피연산자가 거짓이면 전체 식의 결과는 거짓이 됨
  • 이 때 오른쪽 피연산자는 연산할 필요가 없다.
  • 따라서 좌측의 피연산자가 거짓이라면 오른쪽 피연산자는 연산되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// AND 연산에서 좌측이 거짓이면 전체 식의 결과는 거짓이 된다.
int a = 0;
int b = 10;
if (a != 0 && b / a > 10){
	println("참입니다.");
}

// 연산이 되지 않기 때문에 증감연산자 또한 계산되지 않는다.
int c = 1;
int d = 2;
if (c > d && ++c == d){
	println("c의 값은 d와 같습니다.");
}
printf("c : %d\n", c);  // 여기만 출력됨
1
2
# 출력
c : 1

OR 연산에서의 단축 연산

  • 좌측의 피연산자가 참이면 전체 식의 결과는 참이 됨
  • 이 때 오른쪽 피연산자는 연산할 필요가 없다.
  • 따라서 좌측의 피연산자가 참이라면 오른쪽 피연산자는 연산되지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // OR 연산에서 좌측이 참이면 전체 식의 결과는 참이 된다.
    int e = 1;
    int f = 20;
    if (e == 1 || f / e > 10){
        println("참입니다.");
    }

    // 연산이 되지 않기 때문에 증감연산자 또한 계산되지 않는다.
    int g = 3;
    int h = 2;
    if (g > h || --g == h){
        println("g의 값은 h와 같습니다.");
    }
    printf("g : %d\n", g);
1
2
3
참입니다.
g의 값은 h와 같습니다.
g : 3

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments