더북(TheBook)

더 간단한 코드를 생각해 보자. 변수 i의 값을 배열의 i번째 항목에 할당한 뒤 1만큼 증가시키는 코드가 있다고 하자.

v[i] = i++;

보기에는 아무 문제가 없어 보인다. 그러나 이 표현식의 동작은 정의되어 있지 않다.* 왜 그럴까? i의 후위 증가 연산은 i의 기존 값을 할당하고 그 후에 i를 증가시킨다고 보장한다. 그러나 표현식 v[i]를 계산하기 전에 증가 연산을 먼저 수행할 수 있으므로 iv[i+1]에 할당할 가능성도 있다.

마지막 예제는 언뜻 보기에 사이드 이펙트가 항상 발생하지 않는다는 인상을 준다. 일부 매우 까다로운 경우 코드가 동작할지도 모르지만 비정상적인 동작을 찾아내기 훨씬 어려워진다. 설상가상으로 어떤 코드는 누군가가 다른 컴퓨터에서 컴파일을 하거나 컴파일러의 새 버전이 몇 가지 구현 세부 사항을 변경하기 전까지 잠시 동안 동작할 수도 있다.

첫 번째 코드 조각은 뛰어난 프로그래밍 스킬을 보여주며 괄호 없이 연산자 우선순위만 알면 된다는 점을 알려주는 예제 코드라고 볼 수 있다. 그럼에도 불구하고 이러한 프로그래밍 스타일은 모던 C++에 적합하지 않다. C 언어 초기에는 가능한 코드를 짧게 하자는 주의가 있었다. 모니터 없이 기계적인 타자기와 천공 카드로 코드를 입력하기는 어려웠기 때문이다. 하지만 오늘날 디지털 원주민으로 살아가는 우리들에게 몇 글자 더 입력하는 것은 문제가 되지 않는다.

 

* 역주

이를 ‘정의되지 않은 동작(Undefined Behavior)’이라 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.