C の詳細:文字
basic character set
C の規格は二種類の character set を定義している5.2.1#1。
- source character set:ソースファイルの記述に用いられている character set
- execution character set:実行環境で実装されている character set
これらは共に basic character set とロケール依存の extended characters に分けられる。
basic source/execution character set は共に以下の文字を含まなければならない5.2.1#3。
- 大文字アルファベット:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- 小文字アルファベット:a b c d e f g h i j k l m n o p q r s t u v w x y z
- 数字:0 1 2 3 4 5 6 7 8 9
- 29 の記号:! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ˆ _ { | } ˜
- スペース
- 制御文字:水平タブ、垂直タブ、フォームフィード
(ASCII の図形文字はドル記号$とアットマーク@のみ含まれていない。)
basic execution character set は更に以下を含まなければならない5.2.1#2,3。
- ヌル文字
- 制御文字:アラート、バックスペース、キャリッジリターン、改行(new line)
execution character set の文字の値は implementation-defined である5.2.1#1が、以下の制限を受ける。
- ヌル文字は全てのビットが 0 のバイトで表される5.2.1#2
- source/execution character set 共に数字の値は0から 1 ずつ増えなければならない5.2.1#3
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 は文字列リテラル中だろうと問答無用で置換されるのである。
これらは全き過去の遺物であり、現代の C コードで使うべきではない。(C++ の最新仕様では完全に trigraph を取り除く提案もなされている。参考:「Removing trigraphs??!」)