====== 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の大体の処理系で共通の値で扱われます。\\
(参考「[[http://real-c.info/preRep.html|データの表現]])\\
文字リテラルは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になることに注意)__\\