C言語の主要リテラル
リテラル(literal)とは値そのものを表すソースコード上での記述の事です。
## 整数リテラル
整数リテラルは8,10,16進数のどれかで書いた整数値です。
- 8 進数 :034 先頭の0で8進数であることを表す
- 10進数 :28 逆に10進数の先頭は0以外の数
- 16進数 :0x1c 先頭に0xを付けることで16進数であることを表す
このように、もともとの意味の文字列に、意味を付加するためにつける文字を接頭辞(プレフィクス)、接尾辞(サフィックス)と言います。
- 文字列の先頭につくのが、プレフィクス 0xF5BC の 0xがプレフィックス - 文字列の後ろにつくのが、サフィックスです。 0.05f のfがサフィックス
ファイルの拡張子なども(file.txtの.txt)サフィックスの一種です。
整数リテラルを記述すると、その大きさ(2進数での長さ)が評価されて、処理系で定められた型に自動的に変換されます。
例)
15 ⇒ int (short)
2147483648 ⇒ intが4byteなら long
この型の自動選択はサフィックス(suffix、接尾辞)を付ける事で明示的に型を決定できます。
- サフィックス
- 機能
- L
- 型をlong→long longに制限 10l
- LL
- 型をlong longに制限 10ll
- u
- 型をunsignedにする 4u
例えば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 はプログラマの頭の中での値は同じだが、コンピュータプログラム上での値(=型)は別物であることに注意)
- サフィックス
- 型
- F
- float 0.5f
- L
- long double 0.5l
## 文字リテラル
一つの文字はシングルクォート'で囲んで表します。
例)
'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へ型変換されて、初期化値として使われています。
#### エスケープシーケンス
制御文字(改行や、終端文字、タブやベル)などそのまま書くと文法的に問題があるものは、以下のエスケープシーケンスを用います。
- 表記
- 表される文字
- \'
- シングルクォート'
- \\
- バックスラッシュ \
円マークに見えるかもだけど本当はバックスラッシュ - \a
- アラート(alert)
- \b
- バックスペース(backspace)
- \f
- フォームフィード(form feed)
- \n
- 改行(new line)
- \r
- キャリッジリターン(carridge return)
- \t
- 水平タブ(horizontal tab)
- \v
- 垂直タブ(vertical tab)
また\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になることに注意)