단락 평가

0에 무엇을 곱해도 0입니다. 그러면 뒤쪽은 계산해야 할까?

단락 평가

답이 정해지면 나머지는 건너뜁니다

(13 * a) * (b / 13 - 1)에서 a가 0이면 왼쪽이 0이고, 전체도 0으로 정해집니다. 오른쪽은 계산할 필요가 없습니다. 이렇게 피연산자를 다 평가하지 않고 결과를 정하는 것이 단락 평가(short-circuit evaluation)입니다.

교재의 예입니다.

그리고, 또는

&&는 거짓에서, ||는 참에서 멈춥니다

A && B는 둘 다 참이어야 참입니다. A가 거짓이면 B를 보지 않아도 거짓입니다. A || B는 하나만 참이면 참입니다. A가 참이면 B를 보지 않아도 참입니다.

&&는 '그리고', ||는 '또는'입니다.

단락 평가가 없으면

배열 밖의 칸을 읽습니다

배열(값을 번호 붙여 늘어놓은 것, 5강)에서 value를 찾는 반복문입니다. 끝까지 찾지 못해 index가 length와 같아지면 왼쪽 조건이 거짓이 됩니다. 단락 평가가 없으면 그래도 오른쪽 조건을 계산하느라 배열 밖의 LIST[3]을 읽습니다.

칸이 셋이고 찾는 값이 9라는 것은 예시입니다. 칸 번호는 0부터라서 LIST[3]은 없는 칸입니다.

단락 평가가 있으면

오른쪽 조건을 건너뜁니다

단락 평가를 하면 왼쪽 조건이 거짓인 순간 전체가 거짓으로 정해집니다. 오른쪽의 LIST[index]는 계산하지 않으므로, 배열 밖을 읽지 않고 반복이 끝납니다.

언어마다

어느 연산자가 건너뛸까

C, C++, Java는 &&와 ||에 단락 평가를 씁니다. 같은 언어의 &와 |는 언제나 양쪽을 다 계산합니다. Ruby, Perl, ML, F#, Python은 모든 논리 연산자가 단락 평가를 합니다.

논리 연산자는 참과 거짓을 계산하는 연산자입니다. &와 |는 0과 1의 자리(비트)마다 계산합니다.

부작용과 만나면

b++가 될 수도, 안 될 수도

a > b가 참이면 오른쪽을 건너뛰므로 b++가 실행되지 않습니다. 거짓이면 실행되어 b가 1 늘어납니다. b가 바뀔지 말지가 a에 달려 있어서 프로그램의 동작을 예측하기 어렵습니다.

b++는 b를 1 늘립니다. a와 b에 넣은 값은 예시입니다.

다음 편

마지막은 계산한 값을 변수에 넣는 대입문입니다

9편대입문은 값을 넣기만 할까? 6강 목록