while (target->key != key && target != NULL) {
}
다음 코드는 심각한 오류를 불러올 수 있다
왜 그럴까? 한 번 생각해 보자
.
.
.
.
.
.
.
.
.
.
이유는 target이 NULL값인 상황에 있다
저렇게 target != NULL 조건을 뒤로 보내게 되면 조건식을 따졌을 때 target이 NULL이여도 그대로 target->key != key 조건식을 검사하게 된다 하지만 포인터가 NULL일 때 그 포인터가 가리키는 값을 접근하려고 하면 segmentation fault(프로그램이 허용되지 않은 메모리 영역에 접근하려고 할 때 발생하는 오류)가 일어나게 된다 따라서 조건식을 아래와 같이 target != NULL 먼저 오게 해야 한다
while (target != NULL && target->key != key) {
}
조건 순서에 따른 계산 방식을 "단락 평가" 또는 "단락 회로 평가"라고 한다 영어로는 "short-circuit evaluation"이다
단락 평가는 논리 연산자(AND && 또는 OR ||)를 사용할 때, 표현식의 왼쪽 조건만으로 전체 조건의 결과가 확정될 수 있는 경우 오른쪽 조건을 평가하지 않는 것을 말한다 이는 성능 최적화뿐만 아니라 논리적 오류를 방지하는 데에도 중요하다
while (target != NULL && target->key != key)에서 단락 평가가 어떻게 작동되는지 다시 한 번 설명하면
- target != NULL이 false면, 전체 표현식이 false가 된다. 따라서 target->key != key는 평가되지 않는다.
- target != NULL이 true면, target->key != key가 평가된다.
단락 평가는 C, C++, Java, 코틀린, js, Python, 스위프트, C# 등 대부분의 프로그래밍 언어에서 동일하게 적용된다
개발자라면 조건문의 순서와 단락 평가를 고려하여 코드를 작성하는 것이 매우 중요하다 :)
'기타 지식들' 카테고리의 다른 글
스코프의 중요성 (0) | 2024.08.04 |
---|---|
배열의 인덱스가 0부터 시작하는 이유 (0) | 2024.07.24 |
전역 변수의 일장일단 (0) | 2024.07.19 |
오버플로우 방지 코드 작성법 4가지 (0) | 2024.07.05 |
foo bar baz 의미 및 유래 (1) | 2024.03.26 |