3.変数と定数

  1. 変数

    前回は計算結果を表示するプログラムを作ったが,
    実用的なプログラムを作るとなると, これらの値は保存しておきたい場合が出てくる
    そのような時に使うのが変数

    変数は, さまざまな値を保存することができ, その容量は各変数のによって異なる

    たとえば, 整数(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.c

    5行目をみると,
    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言語において=は, 等しいことを示す記号ではない
     あくまでも代入を意味する演算子であることを覚えておこう
     等しいことを示す記号は後日勉強する

  2. double型

    変数を用いて整数値を記憶させることができた
    しかし, これからプログラムを作るうえで, 整数しか扱えないのはかなり不便だ
    そのため, 実数を記憶するための変数としてdouble型がある
    double型は, 有効桁数16桁の実数を記憶でき, int型よりも多くの数を表現できる


    注)だからといってdouble型ばかり使えばいいというわけではない
     小数の計算が必要なときのみdouble型を用い, メモリの無駄遣いをなくそう

  3. キャスト

    次のプログラムをみてみよう

    #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が代入されていることがわかるだろう

  4. 定数マクロ

    プログラムを書いていると, ある数値に特定の意味を持たせたいことがある
    たとえば, 円周率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:

    1. ソースコードcircle.cの2行目, PIの値のみを変更し, その結果を確かめよ

    変数についての練習は次回行う

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です