====== 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になることに注意)__\\