언어 자료구조 알고리즘/디딤돌 C언어

30. 논리 연산자

언제나휴일 2016. 1. 1. 12:03
반응형

 

&&, ||, !
 
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는 변하지 않았어요.

반응형