30. 논리 연산자

&&, ||, !

C언어에서는 논리 연산자로 논리곱(&&) 연산자와 논리합(||) 연산자, 논리 부정(!) 연산자를 제공해요.

C언어에서 피 연산자의 값이 0이면 거짓이며 그 외의 값은 참이예요.
그리고 연산식이 참일 때 연산 결과는 1이고 거짓일 때 연산 결과는 0이랍니다.

논리곱 연산은 피 연산자가 모두 참일 때만 연산 결과가 참이고 그 외에는 모두 거짓이예요.
논리합 연산은 피 연산자 중에 하나라도 참이면 연산 결과는 참이고 둘 다 거짓일 때만 거짓이죠.
논리 부정은 단항 연산자로 피 연산자가 참이면 연산 결과는 거짓이고 피 연산자가 거짓이면 연산 결과는 참이예요.

◈ 논리 연산

#include <stdio.h>
int main()
{
    printf("%d %d %d \n", 3&&2, 0&&2, 0&&0);
    printf("%d %d %d \n", 3||2, 0||2, 0||0);
    printf("%d %d \n", !3, !0);
    return 0;
}

◈ 실행 결과

1 0 0
1 1 0
1 0

그리고 C언어에서 논리곱 연산에서는 하나의 항만 거짓이어도 연산 결과는 거짓이죠.
따라서 좌항이 거짓일 때는 우항을 확인하지 않아요.
또한 논리합 연산에서는 좌항이 참이면 우항을 확인하지 않아도 참이므로 우항을 확인하지 않아요.

◈ 논리 연산에서 주의할 점

#include <stdio.h>
int main()
{
    int a = 0, b = 0, re = 0;
    re = (a=3)||(b=b+3);
    printf("a:%d b:%d re:%d\n",a,b,re);
 
    re = (a=0)&&(b=4);
    printf("a:%d b:%d re:%d\n",a,b,re);
    return 0;
}

◈ 실행 결과

a:3 b:0 re:1
a:0 b:0 re:0

위 예를 보면 (a=3)||(b=b+3)의 연산 결과는 참이예요.
좌항인 (a=3)은 a 변수에 3을 대입하는 것이며 연산 결과는 대입 연산 이후의 a 값인 3이예요.
논리합 연산에서 좌항이 참이면 우항을 수행하지 않죠.
따라서 (b=b+3) 부분은 수행하지 않아요.
결과적으로 출력 내용을 보면 a는 3으로 변한 것을 알 수 있지만 b는 변하지 않았죠.

그리고 (a=0)&&(b=4)의 연산 결과를 보면 거짓이예요.
좌항인 (a=0) 부분은 0인 값을 a 변수에 대입하고 연산 결과는 대입 연산 이후의 a 값인 0이예요.
논리곱 연산에서는 좌항이 거짓이면 우항을 수행하지 않죠.
따라서 (b=4)를 수행하지 않아요.
결과적으로 출력 내용을 보면 a는 0으로 변하였지만 b는 변하지 않았어요.