C언어

Hagi 2012. 1. 17. 16:46

 (출처 : 뇌를 자극하는 ASP.NET 2.0 프로그래밍, P102)


&는 'AND'이고, &&는 'short-circuit AND'입니다. 그리고 |는 'OR'이고, ||는 'short-circuit OR'입니다. short-circuit의 뜻을 굳이 풀이하자면 '짧은 선회', '짧은 회로' 또는 '단락' 정도로 풀이할 수 있습니다. 그런데 &&과 ||는 왜 이런 뜻을 가지고 있을 까요?

AND의 경우 좌측 피연산자가 false이면 우측 피연산자가 무엇이든지 간에 결과값이 false입니다. 


 false AND ( true or false) -> 무조건 false


하지만 &는 좌측 피연산자가 false라도 무조건 우측 피연산자를 검사합니다. 반면에 &&(short-circuit AND)의 경우 좌측 피연산자가 false이면 우측 피연산자를 검사하지 않고 바로  false라는 결과 값을 반환합니다. 물론 좌측 피연산자가 true이면 우측 피연산자에 따라 결과가 바뀌므로 우측 피연산자를 검사합니다. 


OR의 경우도 마찬가지입니다. OR는 좌측 피연산자가 true이면 우측 피연산자에 상관없이 결과값은 true입니다. |는 좌측 피연산자가 true라고 하더라도 우측 피연산자를 무조건 검사합니다. 반명에 ||는 그렇지 않다는 것이죠. 


 그러므로 보통 논리 비교 시 &, |보다는 효율성 있는 &&과 ||을 많이 사용합니다. 하지만 경우에 따라 &, |또는 중 어느 것을 사용하느냐에 따라 그 결과가 달라질 수 있습니다. 다음과 같은 예가 바로 그와 같은 경우입니다. 


 int a = 10;

 int b = 20;

 bool c = (++a > ++b) & (++a > ++b);


&을 사용하면 a는 12, b는 22가 될 것이고, & 대신 &&을 사용하면 a는 11, b는 21이 될 것입니다. 그 이유는 현재 좌측 피연산자가 false이므로 &&을 사용할 경우 우측 피연산자가 연산되지 않기 때문입니다. 우측 피연산자가 연산되지 않으면 변수 a,b에 사용된 증가 연산자가 실행되지 않습니다. 고의성이 없는 한 이렇게 코딩하는 경우는 드뭅니다. 하지만 있을 수 있는 경우이므로 &,|과 &&,||의 차이점을 확실히 해둡시다.