2010-11-08
定数の取り扱い
定数
これまでに、#defineディレクティブを使って記号定数を定義したり、列挙型を使って定数のリストを定義してきました.今回は、もう少し定数について深く見ていくことにします.
定数は、変数とは違いプログラム中で変化することのない値です.例えば、ソースコードに
#define NUM 100 const int VALUE=100;
と直接書きこんだ値は、定数ということになります.整数なら整数定数、浮動小数なら浮動小数点定数、文字なら文字定数、文字列なら文字列定数(文字列リテラル)といいます.
接尾子
C言語では、10などの数を扱う時、明示的にその定数の型を示す必要はありません.なぜなら、Cコンパイラは明示的に型を指定しなければデフォルトでint型であると判断するためです.しかし、int型以外の型を定数として扱いたい場合があります.例えば、なんらかの数学定数(円周率等)だとか、丸め誤差の範囲とか、ですね.また、関数の引数として定数を渡す時にも、定数の型が重要となります.
そこで、C言語には「定数がどのような型」であるかを明示的に示すために接尾子(サフィックス)が用意されています.接尾子は数値定数の型を指定するもので、数値の末尾につけます.数値の末尾に特定のアルファベットを付けて型を強制するわけです.このアルファベットを接尾子(サフィックスとも)といいます.
型 | サフィックス |
---|---|
unsigned | U(u) |
long | L(l) |
unsigned long | UL(ul) |
float | F(f) |
long double | L(l) |
通常、サフィックスは小文字でも大文字でも構いません.「U」と「UL」は整数に、「F」は浮動小数に使います.「L」は整数に使えば long int型、浮動小数に使えば long double型として扱われます.
list1
#include <stdio.h> int main() { printf("%ld\n", 128L); return 0; }
接頭子
サフィックスは定数の末尾に付ける文字でしたに.サフィックスとは反対に定数の先頭に付ける文字を接頭子(プリフィックス)といいます.例えば、8進数を扱う0、16進数を扱う0x、ワイド文字列定数を扱うLがあります(ワイド文字についてはまた後で取り上げます).
char * str=L"Hello, world";//ワイド文字列リテラル int num =028;//8進 int num =0x28;//16進
文字列定数
C言語では文字列定数を連結して書くと、コンパイル時に連結されて一つの文字列となります.
例えば、
list2
#include <stdio.h> int main() { printf("abcdef""ghijk\n"); return 0; }
を実行すると
abcdefghijk
と出力されるはずです.また、Cのソースでは、改行が意味を持たないため、長い文字列定数を扱いたいときには、2行に分けて書くこともできます.
浮動小数定数
浮動小数点数を表現する方法には、これまでに扱ってきた実数を使う方法、そして科学的記法という記法で表現する方法があります.
前者から見ていくことにしましょうか.これまで、定数を書く時
100 100.0
など書いてきました.これは、コンパイラが小数点の有無で実数か整数かを判断するためです.したがってコンパイラは、上の数値を整数、下の数値を実数として判断します.また、小数点以下が0であれば、0は省略することが可能です.逆に整数部が0の時も省略可能です.つまり、浮動小数点数の値は、
100. .100
として表現することもできます.ただし、小数点は残さなければなりません.
さて、もうひとつの表記法である科学的記法を見ていきましょう.浮動小数点数を扱うとき非常に大きな値や小さな値を使いたい時があります.このように極端な値を扱いた時には、科学的記法が便利です.科学的記法とは、
仮数部 E(e)符号部 指数部
のような表記方法です.computer scienceを学んだことがある人は、見慣れた記法だと思います.書くのもあれですが(めんどくさい)一応、解説しておきましょう.
「仮数」に小数の数の並びを書きます.「E」はそのままアルファベットでE(あるいはe)と書きます.「符号」には+あるいは-を指定します.符号部は省略可能で省略すると+と扱われます.「指数部」には、表現したい小数は、仮数部で指定した数に対して、10 の何乗であるか書きます.
例として、円周率を実数で表記したものと、科学的記法で表記したものを挙げておきます.
list3
#include <stdio.h> int main() { double foo=3.141592; double bar=3141592e-6; printf("foo=%f\n", foo); printf("bar=%f\n", bar); return 0; }
Last modified:<2010/11/09 01 :38 :13>
posted from emacs23.1
購入: 8人 クリック: 53回
- 4 http://d.hatena.ne.jp
- 4 http://mixi.jp/show_profile.pl?id=8435123&from=navi
- 2 http://reader.livedoor.com/reader/
- 2 http://www.google.co.jp/search?q=gnuplot+class++c++&hl=ja&lr=&client=firefox-a&hs=yYz&rls=org.mozilla:ja-JP-mac:official&channel=s&ei=u7TYTLzKFYjMuAPCpPj5CQ&start=20&sa=N
- 1 http://d.hatena.ne.jp/diarylist?of=0&mode=rss&type=public
- 1 http://d.hatena.ne.jp/diarylist?of=50&mode=rss&type=public
- 1 http://mixi.jp/view_diary.pl?url=http://d.hatena.ne.jp/Crest/20101108#1289228948&owner_id=8435123
- 1 http://search.yahoo.co.jp/search?p=crest+判決&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt
- 1 http://search.yahoo.co.jp/search?p=goolge+日本語入力+&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt