관계 연산자

A == B : AB가 같으면 참(1)

A != B : AB가 다르면 참(1)

 


논리 연산자

A && B : AB 모두 참일 경우 참(1). 논리곱

A || B : AB 둘 중 하나가 참이면 참(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

+ Recent posts