リテラル(literal)とは値そのものを表すソースコード上での記述の事です。
## 整数リテラル
整数リテラルは8,10,16進数のどれかで書いた整数値です。
このように、もともとの意味の文字列に、意味を付加するためにつける文字を接頭辞(プレフィクス)、接尾辞(サフィックス)と言います。
- 文字列の先頭につくのが、プレフィクス 0xF5BC の 0xがプレフィックス - 文字列の後ろにつくのが、サフィックスです。 0.05f のfがサフィックス
ファイルの拡張子なども(file.txtの.txt)サフィックスの一種です。
整数リテラルを記述すると、その大きさ(2進数での長さ)が評価されて、処理系で定められた型に自動的に変換されます。
例)
15 ⇒ int (short)
2147483648 ⇒ intが4byteなら long
この型の自動選択はサフィックス(suffix、接尾辞)を付ける事で明示的に型を決定できます。
例えば12Lはintに収まる値ですが、Lがあるのでlong型になります。大文字・小文字はどちらでもよいのですが、小文字のlはフォントと次第で数字の1と紛らわしくなるので避けた方がよい。
またUよりはuの方が数字と高さが揃わなくて見やすいと思われます。
8,16進数でも、あまり変わらん感じで書きます。
## 浮動小数点リテラル
浮動小数点数については
- 普通の小数:0.007297 (固定小数点表記) - 指数表記 :7.297E-3 (科学的記数法、浮動小数点表記)
があります。指数表記の底は 10 で、別に仮数の制限は無いので0.7297E-2と書いても同じ事です。Eはeでもよく、指数の符号が+の場合は省略できます。(7.297E13)
小数点の前後の0は省略ができ、.1は0.1に、1.は1.0に等しい意味を持ちます。
実数リテラルは基本的にdouble型で、サフィックスにより型の指定ができます。
(この時点で、1. と 1 はプログラマの頭の中での値は同じだが、コンピュータプログラム上での値(=型)は別物であることに注意)
## 文字リテラル
一つの文字はシングルクォート'で囲んで表します。
例)
'a'
'B'
'*'
など
文字リテラルは実際には、ASCII コードそのものです。
例えば'A'は0x41と書くのと同じ事になります。ASCIIコードはCの大体の処理系で共通の値で扱われます。
(参考「データの表現)
文字リテラルはcharではなくint型に変換されます。(これもCの難解なところ。。。)
実際に、標準入力(コンソール)から1文字だけ文字を取得するC言語の関数 getchar()がありますが、
getchar()関数は、入力から1文字受け取って、そのアスキーコードをintで返してきます。
(getchar()なのに、intの変数で受けるとか、とても難解)
例えば、
char c = 'b';
では、intの'b' = 0x62 = 98 が変数のcharへ型変換されて、初期化値として使われています。
#### エスケープシーケンス
制御文字(改行や、終端文字、タブやベル)などそのまま書くと文法的に問題があるものは、以下のエスケープシーケンスを用います。
また\8進数か\x16進数でアスキーコードの値を直接指定する事もできる。
char c = \0155; /* m:109(10進数)の8進数表記 */ char d = \x6d; /* m:109(10進数)の16進数表記 */
## 文字列リテラル
文字列はダブルクォート“で囲んで表します。
文字列リテラルは基本的にメモリの読み込み専用領域へchar配列として配置され、そのアドレスが実際の値になります。例えば
char str[] = "jc21";
は、{ 'j', 'c', '2', '1', '\0' }が格納された文字配列(の先頭要素)のアドレスによりポインタstrを初期化します。
(末尾には文字列の終端を表す終端文字(=ヌル文字)が挿入されるので、配列の大きさは文字数+1になることに注意)