「C言語/記法」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎__func__: C11を参照
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎文字集合: ISO/IEC 9899:2011(通称 C11)から§5.2.1 ''Character sets'' を抄訳/引用。
タグ: 2017年版ソースエディター
3 行
 
== 文字集合 ==
ISO/IEC 9899:2011(通称 C11)の §5.2.1 ''Character sets'' の冒頭を抄訳/引用します。
C言語のプログラムは次にあげる文字を使って記述される。
<blockquote class="toccolours" cite="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf">
また、次にあげる文字以外にもコンパイラが対応していれば使用できる。
 
(C言語の処理系実装者は)2つの文字セットとそれに関連する照合順序( ''collating sequences'' )を定義しなければなりません<ref name="jtc1-sc22-wg14-n1570-7">{{cite book
*26個のラテンアルファベットの大文字
| url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
<pre>
| title = C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
| page=22, §5.2.1 ''Character sets''
| publisher = ISO/IEC}}</ref>。
'''ソース文字セット'''(''the source character set''; ソースファイルを記述するための文字セット)と、'''実行文字セット'''(''the execution character set''; 実行環境で解釈される文字セット)です<ref name="jtc1-sc22-wg14-n1570-7"/>。
それぞれのセットはさらに、'''基本文字セット'''( ''basic character set'' )と、拡張文字と呼ばれる0個以上の地域固有のメンバー(基本文字セットのメンバーではない)のセットに分けられます<ref name="jtc1-sc22-wg14-n1570-7"/>。
組み合わせたセットは、'''拡張文字セット'''( ''extended character set'' )とも呼ばれる。実行文字セットのメンバーの値は、実装で定義されます<ref name="jtc1-sc22-wg14-n1570-7"/>。
 
文字定数( ''character constant'' )や文字列リテラル( ''string literal'' )では、実行文字セットのメンバーは、ソース文字セットの対応するメンバーで表すか、バックスラッシュ( \ )に1つ以上の文字を続けたエスケープシーケンスで表します。
 
基本実行文字セット( ''basic execution character set'' )には、すべてのビットを0にしたバイト(ヌル文字)が存在し、文字列の終了に使用されます。
 
基本ソース文字セットと基本実行文字セットは、ともに次のものを有するものとする。メンバー:
 
*26個の;ラテンアルファベットの大文字26文字
:<pre>
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
</pre>
*26個の;ラテンアルファベットの小文字26文字
:<pre>
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
</pre>
*;10個の10進数字
:※ラテンアルファベットの各文字の値は、連続しているとは限らない。例えばASCII文字コードでは連続しているが、EBCDIC文字コードでは'A'~'I', 'J'~'R', 'S'~'Z'の3つに分かれ連続していない。<ref>『[迷信] 'A'~'Z' の値は連続している | 株式会社きじねこ』http://www.kijineko.co.jp/tech/superstitions/A-to-Z-is-sequence.html</ref>
:<pre>
 
*10個の10進数字
<pre>
0 1 2 3 4 5 6 7 8 9
</pre>
;以下の29種類のグラフィックキャラクター
:※0の右側に並んでいる各文字の値は、1つ左側にある文字の値に比べ1だけ大きくなければならない。<ref>『JISX3010:2003』p.12「5.2.1 文字集合」</ref>
:<pre>
 
*29個の図形文字
<pre>
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
</pre>
;空白文字と、水平タブ、垂直タブ、フォームフィードを表す制御文字
 
ソース基本文字セット及び実行基本文字セットの各メンバの表現は、1バイトに収まるものとする。ソース基本文字セット及び実行基本文字セットともに、上記の10進数のリストの0の後の各文字の値は、前の文字の値よりも1つ大きくなければならない。
*空白文字
 
ソースファイルでは、テキストの各行の終わりを示す何らかの方法がなければならない。本国際規格では、そのような行末表示を1つの改行文字のように扱う。基本実行文字セットには、アラート、バックスペース、キャリッジリターン、改行を表す制御文字がなければならない。
 
ソースファイルに他の文字が含まれている場合(識別子、文字定数、文字列リテラル、改行を除きます)。
識別子、文字定数、文字列リテラル、ヘッダ名、コメント、トークンに変換されない前処理トークンを除く)、動作は未定義です。
 
文字とは、上で定義したように、大文字または小文字のことです。
 
この国際規格では、この用語には他のアルファベットの文字である他の文字は含まれません。
 
汎用文字名( ''universal character name'' )は、他のキャラクタに名前を付ける方法を提供する。
前方参照:汎用文字名(§6.4.3)、文字定数(§6.4.4.4)、前処理ディレクティブ(§6.10)、文字列リテラル(§6.4.5)、コメント(§6.4.9)、文字列(§7.1.1)。
</blockquote>
 
*制御文字(水平タブ、垂直タブ、書式送り)
 
=== 3文字表記 ===
{{Wikipedia|トライグラフ|3文字表記}}
ISO/IEC 9899:2011(通称 C11)の §5.2.1.1 ''Trigraph sequences'' の冒頭を抄訳/引用します。
<blockquote class="toccolours" cite="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf">
他の処理を行う前に、次のような3つの文字の並び(トライグラフ・シーケンス=3文字表記と呼ばれる)のうちの1つが出現するたびに、対応する1つの文字に置き換えられます。
 
:<pre>
3文字表記(トライグラフシーケンス)とは、次に示す左側の3つの文字の並びである。
<pre>
??= #
??( [
49 ⟶ 75行目:
??- ~
</pre>
これ以外の3文字表記は存在しません。
3文字表記がソースファイルの中にある場合、その3つの文字の並びを同じ行の右側の対応する1文字に置き換える。
これら以外の上に掲げた3文字表記に当てはまるらない ? は、存在し置き換えない。
</blockquote>
上に掲げた3文字表記の始まりとならない?は、置き換えない。
 
3文字表記は、7ビットUS ASCII符号集合の部分集合であるISO/IEC646で規定する普遍符号集合に定義がない文字の入力を可能にしま
<ref>『JISX3010:2003』p.13「5.2.1.1 3文字表記」</ref>
 
3文字表記に一致する文字列を表記したい場合、「?」の代わりに逆斜線表記(エスケープシーケンス)の「\?」を用いるとよい。
現在、3文字表記はほとんど使われず、コンパイラによっては、デフォルトで無効にであったり、実装されていなかったり、デフォルトで無効になっ外部のプロプロセッサとして実装されていたりする。
 
=== 多バイト文字 ===
ISO/IEC 9899:2011(通称 C11)の §5.2.1.2 ''Multibyte characters'' の冒頭を抄訳/引用します。
多バイト文字もコンパイラが対応していれば使用できる。<ref>『JISX3010:2003』p.13「5.2.1.2 多バイト文字」</ref>
<blockquote class="toccolours" cite="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf">
ソース文字セットには、拡張文字セットのメンバーを表すために使用されるマルチバイト文字が含まれることがあります。
実行文字セットは、マルチバイト文字を含むことができますが、これらの文字はソース文字セットと同じエンコーディングである必要はありません。
 
両方の文字セットについて、次のことを守らなければならない。
* 基本文字セットが存在し、各文字が1バイトでエンコードされていること。
* 追加メンバーの存在、意味、表現はロケールに依存します。
* マルチバイト文字セットは、マルチバイト文字の各シーケンスが初期シフト状態で始まり、特定のマルチバイト文字がシーケンス内で出現したときに、他のローカル固有のシフト状態に入るような、状態に依存したエンコーディング( state-dependent encoding )を行うことがでます。
** 最初のシフト状態では、すべてのシングルバイト文字は通常の解釈を維持し、シフト状態を変えることはありません。シーケンス内の後続のバイトの解釈は、現在のシフト状態の函数<!--mainのような関数特別するため函数とした-->です。
* すべてのビットがゼロのバイトは、シフト状態によらず、ヌル文字として解釈される。このようなバイトは、他のマルチバイト文字の一部として発生してはならない。
</blockquote>
標準では上記のように、文字集合と符号化方式の両方を規定して''いない''ので移植性や相互運用性については、プログラマが工夫することとなります。
 
== 字句 ==