C言語入門::変数と型とprintf
次は,変数と型とprintf関数の少し詳しい使い方です.
変数
変数という言葉は前回から出てきてますが,使い方はまだ説明していませんでした.変数はどんなデータを入れるか宣言しなければ使えません.
int x;
という風に宣言します.intというのはデータ型の名前で,次で説明します.
型
C言語で使えるデータ型はたくさんありますが,以下のようなものがあって,場合によって使い分けます.
- int
- char
- short
- long
- float
- double
- void
型によって記憶できる数値の大きさや精度が違います.多くの型は環境によっても代入できる最大値や最小値に差がありますが,ここでは一般的な環境での話しをします.
int
もっとも標準的な整数型です.特に必用が無ければこの型にするのが良いでしょう.
「もっとも標準的な」というのが気にかかりますが,実はこのint型は特殊で実行する環境によって記憶できる数値の大きさが違います.
最近のCPUは32ビットですので,intも32ビットです(longと同じ).昔は16ビットでした.中にはintが8ビットという環境もあります.
int型はCPUで一度に扱える大きさになっているので,int型で書いておけば,多くのCPUで効率よく実行できるという見方もできます.
char
charは8ビットの整数です.
この型の変数は普通は「-128~127」の値が使えます.
整数型には,「signed(符号あり)」と「unsigned(符号無し)」の2種類があって,signedは負の数が扱えて,unsignedは負の数が扱えない代わり最大値が倍になります.
signedやunsignedをcharの前に付けて宣言できます.
unsigned charと書けば,「0~255」の値が使えます.
charという名前は,characterから来ていて「文字」を表します.コンピュータでは文字はASCIIコードという数値で管理していて,0~127までの値が割り当てられています.つまり,charには文字が入れられるということですね.
残念ながら,日本語は文字数が多いのでそのままでは入りません.いわゆる半角カナや記号などは128~255に入っていて,どうにか扱えます.
short
shortは16ビットの整数です.
- 32768~32767の数値が扱えます.
unsigned shortとすると,負の数が扱えない変わりに「0~65535」の範囲になります.
単に「short」と書く場合が多いですが,正確には「short int」です.これは下のlongも同じです.
long
longは32ビット整数です.
範囲は「-2147483648~2147483647」
これも,unsigned longにすると4294967296まで扱えます.
float
整数型があるなら,少数型とか複素数型とかもあるんだろうと思われた方は鋭い.でも少し惜しいです.C言語では完全な実数は扱えませんし,今のところ標準となっているC言語では複素数型もありません(新しいC言語では使えたりしますが).
というわけで,floatで実数が扱えます.
ただし,精度に気をつける必要があります.最近のCPUはFPU(浮動小数点数演算ユニット)を持っているので次にある,精度の高いdoubleを使った方が良いでしょう.
double
doubleは倍精度実数です.floatの倍の精度で計算できます.倍の精度というと,計算も倍かかってしまいそうですが,最近のCPUではそんなことはありません.float型の数値でもCPU内部ではdoubleとして計算しています.
計算時間は同じでもdoubleの計算結果をfloatに変換している分だけfloatを使った方が処理が遅かったりします.ただし,精度が倍なので,メモリも倍使います.
void
voidとは「空」の意味です.普通の型では無く,変数宣言ではポインタ以外に使えません.
何も値を返さない関数の宣言としてもつかいます.
ちょっと違いますが,一応ここで説明.
signedとunsigned
データ型の前に付けて,符号付か符号無しかを明示することが出来ます.あと,「unsigned int」等は単に「unsigned」と書くことが出来ます.型の名前を書かなければint型とみなされますが,書いておいたほうが混乱が無いでしょう.
文字列
ほぼ,データ型が出揃ったわけですが,文字列がありませんね.実は文字列というのは,「文字(char)の配列」なんです.配列は後で出てくるので,そのときまでは深く考えなくて良いです.
型変換
暗黙の型変換
必要なときに勝手に型を変換してくれる場合があります.たとえば,intとdoubleの足し算をする場合,型はdoubleに合わせられます.また,doubleの値をint型の変数に代入したときなどは,intに変換されます.
明示的な型変換(キャスト)
int a=5,b=10; double d; d = a/b;
このとき,dには0が代入されます.aとbはintなので,小数点以下が切り捨てられ,0になってしまい,double型のdに代入しても0のままです.これが困る場合は以下のように明示的にキャストします.
int a=5,b=10; double d; d = (double)a/b;
こうすると,dには0.5が代入されます.
(double)のように(型名)と書くと,その後に続く数値がその型に変換されます.この例とは逆に,double同士の演算結果の小数点以下を切り捨てたい場合はintにキャストすれば良いです.
double a=5.0,b=10.0; double d; d = (int)a/b;
dには0,5が代入されます.これは,思った結果と違うかもしれません.intにキャストされるのは,a/b*3の結果の1.5ではなくて,aの5.0です.そして,a/bの演算はbがdoubleなので,再びdoubleに変換されます.括弧でくくって,d = (int)(a/b);と書けば思った結果になると思います.
宣言の仕方
ANSIのCでは関数の始めに,他の処理を書く前に変数を宣言する必要があります.最近のコンパイラでは,どこでも宣言できるようになっているものも多いです.
int x; // 最も単純な例 unsigned char a,b; // 複数の変数を同時に宣言できます double c=1.5,d=3.14159; // 初期値を代入しておくことも可能です long e=91,f; // もちろん必用な変数のみ初期値を入れることも可能です
変数は宣言した位置より後ろで使えます.
関数の外で宣言すると,複数の関数から参照できます.グローバル変数といいます.逆に,関数内で宣言されたものは,ローカル変数といい,関数内でしか使えません.
printf
printfは前回の最後でも出てきましたね.
printf関数は色々な型のデータを指定した形式で表示することが出来る関数です.便利なのでこの辺で覚えておきましょう.
#include <stdio.h> int main() { int a,b; // 変数の宣言は最初に a=10; b=21; printf("aとbの和:%d\n",a+b); return 0; }
int printf(const char *format, ...);
- %d 整数 (int,long,short)
- %u 符号無し整数 (unsigned)
- %c 文字 (char)
- %s 文字列 (char*)
- %f 実数 (double,float)
- %% 「%」という文字を出力
他にも,%xで16進数で出力するとか,色々あります.
入出力の回でもう少し詳しい話をする予定です.たぶん.
残り
まだ説明していない単語の残りは以下の通りです.
auto,break,case,const,continue,default,do, else,enum,extern,for,goto,if, register,return,sizeof,static, struct,switch,typedef,union,volatile,while
少し減りましたが,まだまだ結構ありますね.
ちょっとした小話
今回はFPUの話をします.最近はFPUって言葉もあまり聞かなくなりました.FPUというのは,「Floating point number Processing Unit」のことで,浮動小数点数(floatやdouble)を使った計算をするための装置です.
昔はCPUとは別にFPUを買ってくるのが一般的でしたが,最近の多くのCPUはFPUを内蔵しているのでそんな必要はありません.
一昔前のCPUはそんなもの持って無いので,FPUが無い場合はソフトウェアで処理していました.FPUをつけると,浮動小数点数の計算速度が劇的に高速になるらしいという噂を聞いていたので,初めてPentium系のCPUのパソコンでプログラムを書いたときは凄く感動した…かというと,それほどでもありませんでした.だって,今まで使ってたCPUが12MHzで,新しいのが166MHz.計算が速くなって当然.
それよりも,4MHzから12MHzになったときのほうが,ギャップが大きかったです.
この文書の履歴
- 2006-04-XX まだ未公開