단락 평가(Short-circuit Evaluation)란?

논리 연산 and(그리고)나 or(또는)에서 왼쪽 값만으로 결과가 정해질 때 오른쪽을 평가하지 않는 평가 방법. and에서는 왼쪽이 거짓이면, or에서는 왼쪽이 참이면 오른쪽을 평가하지 않는다. 배열 범위 확인을 왼쪽에 써서 범위 밖 참조를 막는 데 자주 사용한다.

일본어 명칭: 短絡評価

단락 평가(Short-circuit Evaluation)은(는) 프로그래밍의 기초(의사 코드 트레이스), C 언어 기초 등 2개 분야의 연습 문제 3개에 나와요.

분야: 프로그래밍의 기초(의사 코드 트레이스)

결과가 바뀌는 경우

오른쪽 식에 함수 호출이나 배열 참조가 포함될 때, 단락 평가인지 아닌지에 따라 결과가 바뀝니다. 'i ≦ n and a[i] ≠ x'는 i가 n을 넘으면 왼쪽이 거짓이 되므로 범위 밖의 a[i]를 참조하지 않습니다. 좌우를 바꾸면 먼저 범위 밖을 참조해 버립니다. 오른쪽에서 호출하는 함수가 변수를 바꿔 쓰는 경우에는 함수가 호출되는 횟수도 바뀝니다.

프로그래밍 언어에서의 취급

C, Java, Python 등 많은 언어에서 논리 연산 &&와 ||(Python에서는 and와 or)는 단락 평가입니다. C나 Java의 &와 |는 양쪽을 반드시 평가합니다. 의사 코드 문제에서 단락 평가가 결과에 관계될 때는 문제 문장의 설명을 따릅니다.

조건 작성법의 요령

단락 평가를 사용하면 '배열의 범위 안이고, 또한 그 요소가 조건을 만족한다'처럼 앞의 조건이 성립할 때만 의미를 가지는 조건을 하나의 식으로 쓸 수 있습니다. 시간이 걸리는 판정을 오른쪽에 두면, 왼쪽에서 결과가 정해졌을 때 생략할 수 있습니다. 한편 반드시 실행되어야 하는 처리를 오른쪽 함수에 넣으면 호출되지 않을 수 있으므로 주의합니다.

자주 묻는 질문

단락 평가는 최적화의 일종인가요?

C, Java, Python 등에서 단락 평가는 컴파일러의 최적화가 아니라 언어의 규칙으로 정해져 있습니다. 따라서 오른쪽이 평가되지 않는 것을 전제로 한 프로그램을 작성해도 올바르게 동작하는 것이 보장됩니다.

not (A or B)와 not A and not B는 같은가요?

드모르간의 법칙에 따라 논리값으로서는 같습니다. not (i > n or a[i] = x)와 i ≦ n and a[i] ≠ x는 둘 다 i의 조건만으로 결과가 정해질 때 a[i]를 평가하지 않습니다.

해설 속 단락 평가(Short-circuit Evaluation)

단락 평가(Short-circuit Evaluation)이(가) 나오는 문제 (3)

  1. 다음 프로그램의 and는 왼쪽 식이 false일 때는 오른쪽 식을 평가하지 않는다(단락 평가). cnt는 전역 변수이다. 실행한 후의 cnt의 값은?
  2. 요소 수 n인 배열 a에서 값 x를 찾아, 찾은 인덱스를 i에 구하는 다음 프로그램이 있다. 배열의 인덱스는 1부터 시작한다. and와 or는 왼쪽 식만으로 결과가 정해질 때는 오른쪽 식을 평가하지 않는다. 【a】에 넣을 조건식 중, x가 a 안에 없을 때 범위 밖의 a[n + 1]을 참조해 버리는 것은?
  3. &&와 ||의 오른쪽에 b++를 쓴 위의 코드를 실행했을 때의 출력으로 올바른 것은?

관련 용어

변수(Variable) 배열(Array) 객체 지향(Object-oriented Programming) 나머지 연산(Modulo Operation) 반올림 오차(Rounding Error) 반환값(Return Value) 비트 연산(Bitwise Operation) 오프 바이 원 오류(Off-by-one Error) 의사 코드(Pseudocode) 인수(Argument)

용어집으로 돌아가기