관계 연산자
A == B : A와 B가 같으면 참(1)
A != B : A와 B가 다르면 참(1)
논리 연산자
A && B : A와 B 모두 참일 경우 참(1). 논리곱
A || B : A와 B 둘 중 하나가 참이면 참(1). 논리합
!A : A의 결과를 참이면 거짓으로,
거짓이면 참으로 반전시킨다.
쇼트서킷(Short-circuit)
논리합의 경우 둘 중 하나면 참이다.
따라서 왼쪽항이 참이면
오른쪽항은 검사하지 않아도
논리합의 전체 결과는 참이다
하지만 논리곱에서는
왼쪽항이 참인 경우에만
오른쪽항의 연산을 수행한다.
반대로 왼쪽항이 거짓이라면
오른쪽항을 검사하지 않아도
전체결과는 거짓이 된다.
이 같은 특징으로
논리연산자와 조합된 다른 연산식이나
조건식이 생략되는 경우를 쇼트서킷이라 한다.
불필요한 연산이 줄어들면
프로그램의 효율이 그만큼 높아진다.
논리 연산은 무조건 왼쪽부터 시작
int k, x = -1, y = -1, z = 1;
k = ++x || ++y && ++z;
printf("%d %d %d %d\n", k, x, y, z);
++x의 연산을 수행해서 x의 값이 0으로 변경.
‘||’연산은 논리합인 논리식이므로
두번째 항을 연산.
++y연산을 수행해서 y의 값이 0으로 변경.
‘&&’연산은 논리곱인 논리식이므로
왼쪽항이 거짓이면
오른쪽항은 연산을 수행하지 않는다.
따라서 ++z는 수행하지 않게 되고
값은 1에서 변하지 않는다.
‘||’연산에서
왼쪽항 오른쪽항 모두 거짓이므로
k에 저장되는 값은 0이 된다.
따라서 0, 0, 0, 1이 출력.
int k, x = -1, y = -1, z = 1;
k = x++ || ++y && ++z;
printf("%d %d %d %d\n", k, x, y, z);
x++연산은 행의 가장 마지막에 연산을 하므로
x의 값인 -1로 ‘||’연산을 따지게 된다
-1의 값은 참이고 ‘||’은 논리식이 논리합이므로
왼쪽항이 참이면 다음 항은
계산을 하지 않아도 참이므로
++y, ++z연산은 수행하지 않는다
따라서 k의 값은 참이 되고 값은 1이 된다.
따라서 1, 0, -1, 1이 출력.
** 잘못알고 있는 것이 있으면 댓글로 알려주시면 감사하겠습니다! **
'프로그래밍 > C언어' 카테고리의 다른 글
sizeof 연산자 (0) | 2018.07.02 |
---|---|
단항 증감 연산자 (0) | 2018.06.28 |
단순 대입 연산자 (0) | 2018.06.28 |
비트연산자 (0) | 2018.06.28 |
자료형, 보수와 음수표현 (0) | 2018.06.14 |