変数と代入の捉え方
この記事はあくまで個人の捉え方を言語化したものであるので、こんな考え方もあるのか程度で捉えてほしい。
数学の「変数」と「代入」 プログラミングの「変数」と「代入」
「変数」「代入」と聞くと数学を思い浮かべる人がいるだろう。プログラミングにおける「変数」と「代入」のおおまかな意味も同じである。しかし、ニュアンスが若干違うため注意が必要である。
数学において、代入する場合「xに3を代入する」と表現する。y = 3x といった式でyの値を求めるときに使う。一方、プログラミングで x = 3 といった式では「3をxに代入する」と表現する。文章としては同じ意味であるが、両者にはどのような違いがあるのだろうか。
数学の代入は 抽象的な値(文字)を具体的な値に置き換える作業 をしている。プログラミングの代入は 具体的な値を抽象的な値(文字)に置き換える作業 をしている。つまり、数学では 値を具体化すること 、プログラミングは 値を抽象化すること が代入という行為なのである。
また、数学の変数は ある値と値の間の取りうる値を文字に置き換えたもの で、プログラミングの変数は 値が便利になった超値 と捉える。プログラミングの変数はあくまで値である。通常の値は自分の値を変化させることができない(1はどう頑張っても1のままである)が、変数は自在に自分の値を変化させることができ便利である。
値を抽象化すると何が嬉しいの?
プログラミングの代入は 数値を抽象化すること と説明した。それでは抽象化すると何が嬉しいのだろうか。具体的なプログラムで説明していく。
あなたは以下のような計算機プログラムを作成した。
code:one_plus_one.c
int main() {
printf("%d\n", 1 + 1);
return 0;
}
実行結果は 2 である。
これを友人に自慢気に見せた。すると友人は「3 + 5」はできないの?と尋ねてくる。3+5を実現するためにわざわざプログラムを書き換えないといけない。これは不毛である。
整数値を実行時に入力して計算をしたい。では変数を導入して抽象化してみよう。抽象化のステップとして以下のプログラムを作成する。
code:one_plus_one_extend.c
int main() {
int num1 = 1;
int num2 = 1;
printf("%d\n", num1 + num2);
return 0;
}
実行結果は変わらず 2 である。しかも数値を変えるためには毎回プログラムを変更する必要がある。ここで落胆しないでほしい。printf文の行に注目してほしい。
code:printfの行.c
printf("%d\n", num1 + num2);
ここに注目するとこの行に限っては、 具体的な数値はわからない が、num1とnum2を足した結果を表示するプログラムと言える。確かに抽象化できている。
ついでに2週間後の自分や他の人が読みやすいコードに書き換えておこう(これもエンジニアにとって大事なことだ)。
code:one_plus_one_extend2.c
int main() {
int num1 = 1;
int num2 = 1;
int sum = num1 + num2;
printf("%d\n", sum);
return 0;
}
新たにsumという合計を表す変数を作った。sumという変数名によって、この変数は足し算の結果を代入しているのだとわかるようになった。そしてprintf文は足し算の結果を出力していることがより明確になった。
ついに抽象化の本領を発揮するときがきた。実行時に整数値を入力して足し算の答えを出力しよう。
code:plus.c
int main() {
int num1, num2;
printf("数値1 > ");
scanf("%d", &num1);
printf("数値2 > ");
scanf("%d", &num2);
int sum = num1 + num2;
printf("%d\n", sum);
return 0;
}
実行した結果がどうだろうか。好きな整数値を入力すれば計算してくれることだろう。これで友人の「3+5」にもドヤ顔で対応できるだろう。
このように変数で表すことで柔軟なプログラムを書くことができた。
【発展】もっと抽象的にしてみよう
友人にドヤ顔したあなただが、友人に「引き算や掛け算はできないのか」と尋ねられてしまった。ここまでくれば対応してやろう。演算子は1文字で表すことができるので、char型を使ってあげると良さそうだ。
code:calc.c
int main() {
int num1, num2;
char ope;
printf("数値1 > ");
scanf("%d", &num1);
printf("演算子(+ - * /) > ");
scanf("%*c%c", &ope);
printf("数値2 > ");
scanf("%d", &num2);
int ans;
switch(ope) {
case '+':
ans = num1 + num2;
break;
case '-':
ans = num1 - num2;
break;
case '*':
ans = num1 * num2;
break;
case '/':
ans = num1 / num2;
break;
default:
printf("そんな演算子ないよ!");
break;
}
printf("%d\n", ans);
return 0;
}
これで四則演算ができる立派な計算機ができた。なんかいろいろ意味不明な記述があると思うけど、それはこれから勉強していくということで(特に scanf("%*c%c", &ope); は意味不明だと思う。これはC言語特有である。)。
また、このプログラムはある入力をすると異常終了してしまう。友人に突っ込まれるより前に見つけて対策してみよう。