C
C言語Day 17

Ancient C探訪記:リテラル編

おことわり: この記事では「1975年頃のC言語」仕様を解説します。2017年現在のC言語仕様とは異なるため、あなたのC言語ライフには役立たないことを予めご承知おきください。

(本投稿は Ancient C探訪記 シリーズの一部です。)

どんどん行きます。リテラル(Literals)/定数(Constants)です。なお、Ancient Cでは“リテラル”という用語は利用されません。

Ancient Cのリテラル/定数

整数(Integer)定数

"C Reference Manual" §2.3.1 Integer constants より引用します。Ancient Cでは “10進数(decimal)” と “8進数(octal)” のみが有効です。16進数(hexadecimal)は 存在しません

An integer constant is a sequence of digits. An integer is taken to be octal if it begins with 0, decimal otherwise. The digits 8 and 9 have octal value 10 and 11 respectively.

ちょっと(かなり?)変わった仕様として、8進数リテラル中に登場した 文字8 と 文字9 は、それぞれ8進数の値 1011 として解釈されます1。ちょっと仕様がアグレッシブ過ぎるのでは...

ancient-octal.c
int x = 0123; /* 10進数の値 83 */
int y = 09;   /* 10進数の値 9  */

なお、当然ながら標準C(ANSI C/C99)では8進数リテラルが文字89を含むことはできません。

文字(Character)定数

"C Reference Manual" §2.3.2 Character constants よりテーブルを引用します。4種の制御文字 BackSpace(\b), NewLine(\n), CarriageReturn(\r), HorizontalTab(\t)、8進数エスケープ文字(\ddd)とバックスラッシュ(\\)がサポートされます。またAncient C(厳密には同Manual)では、文字コードとしてASCIIコードを前提としています。

BS   \b
NL   \n
CR   \r
HT   \t
ddd  \ddd
\    \\

標準C(ANSI C/C99)ではこのほかに、16進数エスケープ文字(\xhh)、シングルクオート(\')、ダブルクオート(\")、クエスチョン(\?)と3つの制御文字:Bell(\a), FormFeed(\f), VerticalTab(\v)が追加されます。

2017年現在、これらの制御文字にお目にかかることはほぼありませんが、FormFeed(\f)文字はPlain TextなRFCファイルに含まれていたりします。

文字列(String)

"C Reference Manual" §2.4 Strings より一部を引用します。文字定数で使えるエスケープ文字に加えて、文字列リテラル中でのダブルクオート(\")もサポートされます。

In a string, the character " must be preceded by a \ ; in addition, the same escapes as described for character constants may be used.

適当に明日以降につづきます。


  1. つまり、それぞれ10進数の 値8 と 値9 に相当します。OK?