本物のC

C の詳細:文字


basic character set

C の規格は二種類の character set を定義している5.2.1#1

これらは共に basic character set とロケール依存の extended characters に分けられる。

basic source/execution character set は共に以下の文字を含まなければならない5.2.1#3

(ASCII の図形文字はドル記号$とアットマーク@のみ含まれていない。)

basic execution character set は更に以下を含まなければならない5.2.1#2,3

execution character set の文字の値は implementation-defined である5.2.1#1が、以下の制限を受ける。

trigraph と digraph

ASCII の文字の一部は ISO/IEC 646 に含まれない。こうした文字を代替する表現が trigraph sequence である。

ソースファイル中??で始まる下表の左の三文字は、右の一文字へと置換される5.2.1.1#1

代替表現 文字
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~

また、C99 では digraph と呼ばれる次の代替表現が加えられた6.4.6#3

代替表現 文字
<: [
:> ]
<% {
%> }
%: #
%:%: ##

digraph は trigraph よりも可読性を高める事を意図しているらしい。

trigraph がソースコードに於ける出現を無差別に置換するのに対し、digraph は文法要素として[ ]などと同等なだけである。この違いは次のコード

#include <stdio.h>
int main(void)
??<
printf("trigraph ??< -> {\n");
printf("digraph %> -> }\n");
%>

が次の出力を与える事から理解できる(正しく動かす為にはコンパイル時に-std=c99オプションが必要)。trigraph は文字列リテラル中だろうと問答無用で置換されるのである。

trigraph { -> { digraph %> -> }

これらは全き過去の遺物であり、現代の C コードで使うべきではない。(C++ の最新仕様では完全に trigraph を取り除く提案もなされている。参考:「Removing trigraphs??!」)