C の知識:リテラル
リテラル(literal)とは値そのものを表すコードの事です。
整数リテラル
整数は八・十・十六進数の何れかで書く事ができます。
- 八進数 :034
- 十進数 :28
- 十六進数:0x1c
先頭の0は八進数を表します。逆に十進数の先頭は0以外の桁でなければならず、08などと書くとどちらにも解釈できなくなるので注意して下さい。また先頭の0xは十六進数を表します。
整数リテラルは基本的にint→long→long longの順で、最初に値を表現できる型になります。例えばintが「C の基本:型」に示した範囲を持つ場合、2147483648はintで表現できないのでlongになります。
この型の選択はサフィックス(suffix、接尾辞)を付ける事で操作できます。
サフィックス | 機能 |
---|---|
L | 型をlong→long longに制限 |
LL | 型をlong longに制限 |
u | 型をunsignedにする |
例えば12Lはintに収まる値ですが、Lがあるのでlong型になります。大文字・小文字はどちらでもよいのですが、小文字のlはフォントと次第で数字の1と紛らわしくなるので避けた方がよいでしょう。またUよりはuの方が数字と高さが揃わなくて見やすいと思われます。
また八・十六進数のリテラルでは、何故か
で型が決められます。例えばそれぞれの整数型が「C の基本:型」に示した範囲を持つ場合、4294967295はlongになる一方で0xffffffffは(同じ数にも拘わらず)unsigned intになります。
浮動小数点リテラル
浮動小数点数については
- 普通の小数:0.007297
- 指数表記 :7.297E-3
があります。指数表記の底は 10 で、別に仮数の制限は無いので0.7297E-2と書いても同じ事です。Eはeでもよく、指数の符号が+の場合は省略できます。
小数点の前後の0は省略ができ、.1は0.1に、1.は1.0に等しい意味を持ちます。
十六進法で実数リテラルを書く事もできますが、この場合は E が桁なのか指数表記を表すのか曖昧になるので、EではなくPを使います。例えば0x0.cP0は 0.11002 = 0.75 になります。
実数リテラルは基本的にdouble型で、サフィックスにより型の指定ができます。
サフィックス | 型 |
---|---|
F | float |
L | long double |
文字リテラル
一つの文字はシングルクォート'で囲んで表します。
文字リテラルは実際には、実行環境での文字コードによって決まる整数値になります。一般に ASCII 文字はどの文字コードでも共通なので、それらの文字リテラルの値は ASCII コードそのものです。例えば'A'は0x41と書くのと同じ事になります(「C の前に:データの表現」の表を参照)。
文字リテラルはcharではなくint型である6.4.4.4#10事に注意して下さい。例えば
char a = 'a'; |
では、intの'a' = 0x61 = 97 が変数の初期化に際してcharへ型変換されています。
制御文字などそのまま書くと文法的に問題があるものは、以下のエスケープシーケンスを用います。
表記 | 表される文字 |
---|---|
\' | シングルクォート' |
\\ | バックスラッシュ\ |
\a | アラート(alert) |
\b | バックスペース(backspace) |
\f | フォームフィード(form feed) |
\n | 改行(new line) |
\r | キャリッジリターン(carridge return) |
\t | 水平タブ(horizontal tab) |
\v | 垂直タブ(vertical tab) |
また\八進数か\x十六進数で値を直接指定する事もでき、ヌル文字'\0'はその一例です。
文字列リテラル
文字列はダブルクォート"で囲んで表します。
エスケープシーケンスは文字リテラルと同じものが使えますが、シングルクォートではなくダブルクォートをエスケープして\"と書く必要があります。
文字列リテラルは基本的にメモリの読み込み専用領域へchar配列として配置され、そのアドレスが実際の値になります。例えば
char *str1 = "abc"; |
は、{ 'a', 'b', 'c', '\0' }が格納された配列(の先頭要素)のアドレスによりポインタstr1を初期化します。(末尾には文字列の終端を表すヌル文字が挿入されます。)
また文字列リテラルはchar配列の初期化にも用いる事ができます。例えば
char str2[] = "abc"; |
では、{ 'a', 'b', 'c', '\0' }が配列str2へ直接格納されます。(初期化を行う場合、必要ないので読み込み専用領域への格納は行われないのが一般的な実装です。)
文字列リテラルが並んでいる場合、それらは結合されます。つまり"abc" "def"は"abcdef"と同等です。