C언어에서 기본으로 사용하는 문자집합(Character set)은 ASCII입니다.
하지만 일부 국가들에서 ISO/IEC 646를 기준으로 하는 키보드를 사용하는데, 우리나라도 여기에 포함됩니다.
여기서 ISO/IEC 646이란 7비트로 문자를 표기하는 방식을 선언해놓은 것으로 미국의 체계인 ASCII를 기반으로 합니다. 숫자나 알파벳은 공통적인 부분과 일부 문장부호(!, ", #, $, &, :, ?, @, [, \, ], ^, _, `, {, |, }, ~)에 대해서 각 나라의 상황에 맞게 변경할 수 있는 부분으로 구성되어 있습니다.
한국의 경우 백슬래시(\)가 원화(\)로 표기됩니다. 그래서 일부 C언어 책자에서 처음에 등장하는 Hello, World!를 출력하는 과정에서 \가 등장하는데 이 문자를 찾지 못하여 지식인과 같은 질문 서비스에 많이 올라왔었습니다.
일부 유럽 국가에서는 변경 가능한 부분을 발음기호로 할당해놓았습니다. 각 문자별로 해당된 값을 보고 싶다면 아래 링크에서 확인이 가능합니다.
https://en.wikipedia.org/wiki/ISO/IEC_646#Variant_comparison_chart
그래서 C언어에서는 삼중자(Trigraph)라는 것을 정의해서 자주 쓰지 않는 문자의 조합으로 다른 문자를 표현하는 방법을 채택하였습니다. 아래 표는 삼중자 표기를 짝을 지어 표현한 내용입니다.
삼중자 |
변경 문자 |
??= |
# |
??/ |
\ |
??' |
^ |
??( |
[ |
??) |
] |
??! |
| |
??< |
{ |
??> |
} |
??- |
~ |
Visual Studio 상에서 컴파일 되는 과정은 아래와 같습니다.
문자 매핑 -> 줄 결합 -> 토큰화 -> 전처리 -> 문자 집합 매핑 -> 문자열 연결 -> 변환 -> 링크
여기서 삼중자는 가장 첫 번째 단계인 문자 매핑 단계에서 해석됩니다.
그렇기 때문에 이스케이프 문자에 ?가 \?로 등록되어 있습니다. 아래 코드를 실행해보면 \?의 필요성을 알 수 있습니다.
#include <stdio.h> int main(){ printf("What?????!\n"); printf("What\?\?\?\?\?!\n"); return 0; }
실행결과 : https://ideone.com/ucu7mn
그래서 이 삼중자를 이용하면 상당히 이상해보이는 코드를 작성할 수 있습니다.
??=include <stdio.h> int main(void) ??< // comment start??/ printf("cannot print this line...??/n"); printf("Hello world!??/n"); return 0; ??>
참고로 C++에서도 이런 삼중자를 지원하긴 했으나 C++17 부터는 제거되었습니다.
'컴퓨터 > C 언어' 카테고리의 다른 글
배열없이 3개 정수 정렬하기 (0) | 2018.07.23 |
---|---|
int형 변수를 이진수로 출력하기 (0) | 2016.09.24 |
[입력-형성평가5] (0) | 2014.10.07 |
[입력-형성평가4] (0) | 2014.10.07 |
[입력-형성평가3] (0) | 2014.10.07 |