읽다 보면 굳이 이런 것까지 생각해야되나 싶은 글일 수 있지만,
여러 환경에서도 동일한 동작을 보장하기 위한 탐구 과정이 의미는 없지 않은 것 같아서 한번 간단하게 기록해본 글이다.
for (char i = 'a'; i <= 'z'; i++)
printf("%c ", i);
a~z까지 출력하는 C 코드를 작성해야 했을 때 자연스럽게 위 코드를 적었다. 근데 갑자기 의문이 들었다. C 표준에선 저렇게 알파벳 소문자들이 연속적으로 인코딩되도록 보장할까?
내가 받은 문제에선 테스트 환경이 명시돼있었기 때문에 그 환경만 확인해보면 됐지만, (본인 포함) 대부분의 사람들이 별 생각 없이 ASCII만 생각하고 저렇게 코드를 작성할 것 같아서('a'
의 ASCII 코드 값인 97을 그대로 사용하는 경우도 있었다), 과연 표준 같은 것에 의해 제대로 보장이 된 건지 궁금했다. ASCII를 사용하지 않는 환경에서도 같은 동작을 하리란 보장은 없지 않을까? 이런 궁금증에 대해 찾아본 것을 차례대로 한번 정리해볼까 한다.
아니다. 반례를 금방 찾을 수 있었다.
EBCDIC이라고 하는 또 다른 문자 인코딩 방식을 보면 아래 표와 같이 알파벳 문자들이 연속된 값을 가지지 않는 다는 것을 알 수 있었다.
즉, 만약 내가 작성한 위에 C 코드의 문자들이 EBCDIC으로 인코딩 된다면 예상하지 못한 결과가 나올 것이다.
C 표준에선 '0'~'9'가 연속적인 코드를 가지도록 명시할 뿐이지 문자에 대해서 존재한다는 말 외엔 언급되는 사항은 없다고 한다.[출처]
(솔직히 대부분 ascii를 사용할 것이고, 다양한 국가의 언어를 지원하기 위해 만들어진 많이 쓰이는 unicode도 ascii의 superset이기 때문에 대부분 경우 위처럼 코드를 적어도 별 문제는 없을 것이다. 무엇보다 저 문제의 테스트 환경에서 테스트해보니 잘 작동했다!)
좀 더 환경 독립적으로 코드를 작성하려면 사실상 아래와 같이 반복문 없이 하나하나 찍어주는 게 가장 확실한 방법일 것이다.
printf("%c ", 'a');
printf("%c ", 'b');
...
printf("%c ", 'z');