본문 바로가기

컴퓨터/C 언어

삼중자(Trigraph)

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
삼중자(Trigraph)  (0) 2018.07.22
int형 변수를 이진수로 출력하기  (0) 2016.09.24
[입력-형성평가5]  (0) 2014.10.07
[입력-형성평가4]  (0) 2014.10.07
[입력-형성평가3]  (0) 2014.10.07

태그