Help us understand the problem. What is going on with this article?

Ancient C探訪記:リテラル編

More than 1 year has passed since last update.

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

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

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

Ancient Cのリテラル/定数


"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。ちょっと仕様がアグレッシブ過ぎるのでは...

int x = 0123; /* 10進数の値 83 */
int y = 09;   /* 10進数の値 9  */

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


"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ファイルに含まれていたりします。


"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? 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away