-
変数
前回は計算結果を表示するプログラムを作ったが,
実用的なプログラムを作るとなると, これらの値は保存しておきたい場合が出てくる
そのような時に使うのが変数だ変数は, さまざまな値を保存することができ, その容量は各変数の型によって異なる
たとえば, 整数(integer)を保存するためにはint型の変数を用意する必要がある
次のプログラムを実行してみよう
#include <stdio.h> int main() { int num; num = 3; printf("num = %d\n", num); num = num + 2; printf("num + 2 = %d\n", num); return 0; }
変数を利用した計算結果を表示するプログラムvar_test.c5行目をみると,
int num;
と記述してある
これが変数の宣言だこれにより, これからnumをint型の整数として扱うことを示し, 値を保存して利用することができる
6行目にあるとおり代入演算子(=)を用いて, 変数numに3を保存すると,
numは整数値3として扱える
その証拠に8行目でprintfを用いてnumを整数として表示すると, 3と表示されたはずだまた, 変数というからには, 途中で値を変更することも可能だ
10行目をみてみると,
num = num + 2;
とあるこれは, 変数numに, num(今は3)と2の和, つまり5を代入するという意味だ
12行目のprintfの表示を見るとそれが確認できるだろう
注)C言語において=は, 等しいことを示す記号ではない
あくまでも代入を意味する演算子であることを覚えておこう
等しいことを示す記号は後日勉強する
-
double型
変数を用いて整数値を記憶させることができた
しかし, これからプログラムを作るうえで, 整数しか扱えないのはかなり不便だ
そのため, 実数を記憶するための変数としてdouble型がある
double型は, 有効桁数16桁の実数を記憶でき, int型よりも多くの数を表現できる
注)だからといってdouble型ばかり使えばいいというわけではない
小数の計算が必要なときのみdouble型を用い, メモリの無駄遣いをなくそう
-
キャスト
次のプログラムをみてみよう
#include <stdio.h> int main() { int a; double b; a = 3 / 2; b = 3 / 2; printf("a = %d\n", a); printf("b = %f\n", b); b = 3.0 / 2.0; printf("b = %f\n", b); return 0; }
3割る2を計算し, 結果を表示するプログラムcalc_int.c実行結果を確認すると, 3/2をdouble型の変数bに代入しても, 値は1.000000だ
これは, 3/2が整数同士の計算のため, 小数点以下が切り捨てられているせいだ正確な値を知るためには, 14行目のように, 数値が実数であることを明示する必要がある
これなら実数同士の計算となので, 正しい値が表示されるしかし, これらが変数の場合はどうだろう
もちろん, double型の変数ならば, 実数として計算されるため, 計算に支障はないが,
int型の場合, 式は整数同士の計算として評価され, 9行目と同じ結果になってしまうこれを防ぐためには, int型の変数をdouble型にキャストする必要がある
変数の先頭に, 型名を括弧でくくって記述することで, その変数を指定した型として扱うことができる実際にプログラムを見てみよう
#include <stdio.h> int main() { int a; double b; int num = 3; a = num / 2; b = num / 2; printf("a = %d\n", a); printf("b = %f\n", b); b = (double)num / 2.0; printf("b = %f\n", b); return 0; }
int型の変数numには整数値3が代入されている
これを, 11行目のように普通に計算してしまっては先ほどと同じで1となってしまうしかし, 16行目にあるようにnumをdouble型にキャストすると, numを実数として扱うため,
bには1.5が代入されていることがわかるだろう -
定数マクロ
プログラムを書いていると, ある数値に特定の意味を持たせたいことがある
たとえば, 円周率3.14などがその例だ
しかし, 利用する際ソースコードに直接3.14とかくのは好ましくない
このような値はたいていソースコードのさまざまな箇所で利用するため, 3.14というマジックナンバーが大量に現れることになる意味のある値は必ずその意味を示す必要がある
しかし, 実行中に値を次々と変えることもないため, 変数を使うのはもったいない
そんなときに使うのが定数マクロだ次のプログラムを見てみよう
#include <stdio.h> #define PI 3.14 int main() { int r = 5; double clen, carea; clen = 2 * r * PI; carea = r * r * PI; printf("半径%dの円について\n", r); printf("円周:%f\n", clen); printf("面積:%f\n", carea); return 0; }
円周と面積を求めるプログラムcircle.c定数マクロはソースコードの一番上,
#include...
とともに書くのが一般的だ
ここでは円周率3.14を, 定数マクロPIとして定義している
このソースコードをコンパイルすると, ソースコード上のPIが, 3.14に展開される
つまり, PIが3.14に置き換わってコンパイルされるのだ
こうすることで, 数値3.14の意味が明確になったさらに, 計算結果を精密にしたいときには, マクロの定義部分のみを3.14から3.141592と変更するだけで,
PIを用いたすべての計算で円周率として3.141592が用いられ, ソースを変更する手間を省くことができるのだ
注)変数と定数の違いを必ず理解しよう
定数マクロに代入はできない
PI = 3.141592と記述しても, 3.14 = 3.141592となる
数値に数値を代入するなど不可能だということはわかるはずだ
Practice:
- ソースコードcircle.cの2行目, PIの値のみを変更し, その結果を確かめよ
変数についての練習は次回行う