&&, ||, !
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는 변하지 않았어요.
'언어 자료구조 알고리즘 > 디딤돌 C언어' 카테고리의 다른 글
35. 대입 연산자 (0) | 2016.01.01 |
---|---|
34. 쉬프트 연산자 (0) | 2016.01.01 |
33. 비트 연산자 ^를 이용한 암호화 (0) | 2016.01.01 |
32. 비트 연산자 (0) | 2016.01.01 |
31. 비교 연산자 (0) | 2016.01.01 |
[디딤돌 C언어] 29. 산술 연산자 (0) | 2016.01.01 |
[디딤돌 C언어] 28. 정리하기 (표준 입출력 개요) (0) | 2016.01.01 |
[디딤돌 C언어] 27. getchar, gets, gets_s 함수 (0) | 2016.01.01 |
[디딤돌 C언어] 26, scanf, scanf_s 함수 (0) | 2016.01.01 |
[디딤돌 C언어] 25. putchar, puts 함수 (0) | 2016.01.01 |