논리곱과 논리합은 기호를 두 개연속으로 사용한다.
뒤에서 살펴볼 비트 연산은 동일한 기호를 한 개만 사용하는데..
이렇게 기억할 수도 있다.
“논리 연산자는 논리를 연산하는 &( 혹은 |) 하나와, 단축연산 여부를 검사하는 검사자 &(혹은 |) 하나가 붙어 두 개로 표현한다.”
정설이 아니라, 그냥 기억하기 위한 방법이다.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
voidlogical_operation(){// && : 논리곱 (AND : 두 가지 모두 참이어야 참)if((8>3)&&(9<2))println("(1) both are true");elseprintln("(1) someone is false");if((8>3)&&(9>2))println("(2) both are true");elseprintln("(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 : 단항연산, 참->거짓 / 거짓->참)inta=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 연산에서 좌측이 거짓이면 전체 식의 결과는 거짓이 된다.inta=0;intb=10;if(a!=0&&b/a>10){println("참입니다.");}// 연산이 되지 않기 때문에 증감연산자 또한 계산되지 않는다.intc=1;intd=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 연산에서 좌측이 참이면 전체 식의 결과는 참이 된다.inte=1;intf=20;if(e==1||f/e>10){println("참입니다.");}// 연산이 되지 않기 때문에 증감연산자 또한 계산되지 않는다.intg=3;inth=2;if(g>h||--g==h){println("g의 값은 h와 같습니다.");}printf("g : %d\n",g);
1
2
3
참입니다.
g의 값은 h와 같습니다.
g : 3
Reference
C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)
댓글 남기기