TAKEAWAY 4.14 논리 연산자는 false나 true 값을 리턴한다.
앞에서 설명했지만 true나 false는 1과 0을 다르게 표현한 것에 불과하다. 따라서 다음과 같이 배열의 인덱스로 사용할 수도 있다.
double largeA[N] = { 0 }; ... /* largeA를 채운다. */ size_t isset[2] = { 0, 0 }; for (size_t i = 0; i < N; ++i) { isset[!!largeA[i]] += 1; }
!!largeA[i]란 표현식에서 largeA[i] 값이 반드시 진리값으로 평가되도록 강조하기 위해 ! 연산자가 두 번 사용됐다(TAKEAWAY 3.4). 따라서 isset[0]과 isset[1]에는 각각 0.0과 같은 값의 개수와 그렇지 않은 값의 개수가 담긴다.
▲ 그림 4-2 isset 배열의 구조
&&와 || 연산자는 단락 평가(short-circuit evaluation)C가 적용된다. 표현이 다소 생소하지만 쉽게 말하면 두 번째 피연산자에 대한 평가는 상황에 따라 생략할 수 있다는 뜻이다.
// 0으로 나누는 일은 절대 발생할 수 없다.
if (b != 0 && ((a/b) > 1)) {
++x;
}
실행 과정에서 a/b 부분에 대한 평가는 생략할 수 있다. 따라서 0으로 나누는 일은 절대로 발생하지 않는다. 이 코드를 다음과 같이 작성할 수도 있다.
if (b) { // 0으로 나누는 일은 절대 발생하지 않는다. if (a/b > 1) { ++x; } }