変数はデータを名前で呼ぶための仕組み。
データを入れる箱に名前をつけておくというふうに考えるといいでしょう。
以下の課題は Hello.c と同様に実習します。
~/c$ gcc k0201.c -o k0201)~/c$ ./k0201)変数を使ったプログラムです。後に説明があります。
1: /* 変数を使う: k0201.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a;
7: int b;
8: int c;
9: a = 13;
10: b = 25;
11: c = a + b;
12: printf( "%d\n",c );
13:
14: return 0;
15: }
行頭の番号とコロン(:)は解説のためにつけてあるものなので、プログラムには入力しません。
文字はここからエディタにコピーできますが、不要な改行やスペースが一緒にコピーされるとコンパイルできなくなることがあります。コピー後に不要なものを削除したり訂正する必要がないか確認しましょう。
重要なところはコピーせず自分で入力したほうが記憶に残ります。
int a; 変数の宣言int a; で a という整数を入れる変数を作ります。最後の ; は Cの文の終わりです。日本語の「。」に相当します。b という整数を入れる変数を作ります。c という整数を入れる変数を作ります。a = 13; 変数へ値の代入a = 13; は変数 a に 13 という整数値を代入することを表します。a を足すことは 13 を足すこと、a を引くことは 13 を引くことになります。b = 25; は変数 b に 25 という整数値を代入することを表します。b = 25; は b と 25 が等しいという意味ではありません。= の右側の値を左側に代入します。 = の左右にスペースを空けるかどうかは趣味の問題です。b=25;とくっつけて書いても問題ありません。; の前後も同様です。c = a + b; 変数の値の参照(使う)a + b つまり、13+25 を計算して、結果を c に代入します。c = a + b; は c と a + b が等しいという意味ではありません。printf( "%d\n",c ) 書式のあるprintf "%d\n",c となっています。これは"%d\n"という書式で c の内容を表示しなさいということです。"%d\n"の%dは十進数(整数)として書く指定です。cは38ですからそのまま38と表示されます。\nは最後に改行するということです。実行結果は
~/c$ ./k0201 38
変数の宣言をまとめることができます。k0201.c に比べてint a,b,c;の部分が異なるだけです。6,7,8行目が6行目1行にまとめられています。
1: /* 変数の宣言をまとめることができる: k0202.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a,b,c;
9: a = 13;
10: b = 25;
11: c = a + b;
12: printf( "%d\n",c );
13:
14: return 0;
15: }
実行結果は同じです。
変数の宣言と代入をまとめることができます。k0201.c に比べてこの色の部分が異なるだけです。k0201.c の 9,10,11行目が6,7,8行目にまとめられています。
1: /* 変数の宣言と代入をまとめることができる: k0203.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 13;
7: int b = 25;
8: int c = a + b;
12: printf( "%d\n",c );
13:
14: return 0;
15: }
int a; と a = 13; をまとめて int a = 13;と書いてもよいということです。int b; と b = 25; をまとめて int b = 13;と書いてもよいということです。int c; と c = a + b; をまとめて int c = a + b;と書いてもよいということです。実行結果は同じです。
printf の書式について。k0203.c に比べてこの色の部分が異なるだけです。
1: /* printfの書式: k0204.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 13;
7: int b = 25;
8: int c = a + b;
12: printf( "%d + %d = %d\n",a,b,c );
13:
14: return 0;
15: }
%d が十進数を書く場所が3つあることを示しています。a,b,c がそれぞれ対応しています。
%d 以外の文字はそのまま表示されます。もちろん \n は改行になります。実行結果は
~/c$ ./k0204 13 + 25 = 38
k0204.c に比べて 8: がなくなって、この色の部分が異なるだけです。
1: /* printfの中で計算させる: k0205.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 13;
7: int b = 25;
12: printf( "%d + %d = %d\n",a,b,a+b );
13:
14: return 0;
15: }
c にあらかじめ a+b の結果を代入する代わりに、printf の中で a+b を計算させることができます。a+b の結果が3番目の %d に対応します。実行結果は同じです。
~/c$ ./k0205 13 + 25 = 38
k0205.c に比べて、この色の部分が異なるだけです。
1: /* 別の書式を試す: k0206.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 13;
7: int b = 25;
12: printf( "%d と %d を掛けると %d です。\n",a,b,a*b );
13:
14: return 0;
15: }
+ や = の代わりに文章にしてみました。%d 以外の部分はそのまま表示されるのです。a*b と掛け算にしました。掛け算の記号 × が半角にないので * を使います。実行結果は
~/c$ ./k0206 13 と 25 を掛けると 325 です。
全部半角記号です。
| 演算 | 足す | 引く | 掛ける | 割る |
| C言語の記号 | + | - | * | / |
k0206.c に比べて、この色の部分が異なるだけです。
1: /* 整数の割り算は整数: k0207.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 20;
7: int b = 3;
12: printf( "%d を %d で割ると %d になります。\n",a,b,a/b );
13:
14: return 0;
15: }
実行結果は
~/c$ ./k0207 20 を 3 で割ると 6 になります。
k0207.c に比べて、この色の部分が異なるだけです。
1: /* 優先順: k0208.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: int a = 20;
7: int b = 3;
8: int c = 5;
9: int s1 = a + b * c;
10: int s2 = (a + b) * c;
11: printf( "%d + %d * %d = %d \n",a,b,c,s1 );
12: printf( "(%d + %d) * %d = %d \n",a,b,c,s2 );
14: return 0;
15: }
実行結果は
~/c$ ./k0208 20 + 3 * 5 = 35 (20 + 3) * 5 = 115
括弧がなければ、足し算より掛け算を先に計算することがわかりました。
* や / は + や - より先に行います。優先がなければ左から順に計算します。
C言語で使われる変数の型のうち主要なものの説明です。
| 変数の型 | 意味 | バイト数 | |
| char | 1バイトの文字 | 1 | 1文字の文字を格納するのに用いられる(日本語の文字は入れられない)。 |
| int | 整数 | 4 | バイト数はコンパイラに依存する (4バイトでは -2147483648 ~ 2147483647 まで表現できる) |
| float | 浮動小数点実数 | 4 | 少数以下をもつ数を代入できる変数 |
| double | 倍長浮動小数点実数 | 8 | floatをより精度・範囲を広げたもの |
この他に、short int(short), long int(long), unsignedのついたもの, long doubleなどがあります。
k0208.c に比べて、この色の部分が異なるだけです。
1: /* float: k0209.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: float a = 20;
7: float b = 3;
8: float c = 5;
9: float s1 = a + b * c;
10: float s2 = a / b;
11: printf( "%f + %f * %f = %f \n",a,b,c,s1 );
12: printf( "%f / %f = %f \n",a,b,s2 );
14: return 0;
15: }
実行結果は
~/c$ ./k0209 20.000000 + 3.000000 * 5.000000 = 35.000000 20.000000 / 3.000000 = 6.666667
%fとすべきところを%dのままにした場合の実行結果は
~/c$ ./k0209 0 + 1077149696 * 0 = 1074266112 0 / 1077149696 = 0
OSの種類、コンパイラの種類により結果は違いますが、変数の型とprintfの書式指定文字(%d,%fなど)が正しく対応しているか確認しましょう。
| 文字 | 対応する変数の型 | 説明 | 使用例 |
|---|---|---|---|
| %c | char | 1文字を出力する | "%c" |
| %s | char * | 文字列を出力する | "%4s", "%-8s" |
| %d | int | 整数を10進で出力する | "%4d","%-4d" |
| %x | int | 整数を16進で出力する | "%2x", "%4x" |
| %f | float | 実数を出力する | "%8.2f" |
| %e | float | 実数を指数表示で出力する | "%8.3e" |
| %g | float | 実数を最適な形式で出力する | "%g" |
| %lf | double | 倍精度実数を出力する | "%12.3lf" |
単に指定文字だけ書いた時は必要な幅が確保されて表示されます。
% と d,f などの間に整数を書くと表示幅をそれに合わせようとします。
f,e などではさらに小数点と整数を書き加えて小数点以下の桁数を指定できます。
k0209.c に比べて、この色の部分が異なるだけです。
1: /* %g: k0210.c */
2: #include <stdio.h>
3:
4: int main()
5: {
6: float a = 20;
7: float b = 3;
8: float c = 5;
9: float s1 = a + b * c;
10: float s2 = a / b;
11: printf( "%g + %g * %g = %g \n",a,b,c,s1 );
12: printf( "%g / %g = %g \n",a,b,s2 );
14: return 0;
15: }
実行結果は
~/c$ ./k0210 20 + 3 * 5 = 35 20 / 3 = 6.66667聖愛中学高等学校