C初級:代入式の考え方(ふだんの行いを式になおしてみる)

C言語初級カテゴリのロゴ画像 C言語初級

プログラムは、変数をどう扱うかが大事だと言えます。
コンピュータは内部的に全て数値化して判断するため、たいそうに見えるAIも内部では数値を判別して計算しているだけです。

例えばコンピュータと人間がじゃんけんをするゲームを作ったとします。
そのときあたかもグー、チョキ、パーを出しているように見えても中身はグー、チョキ、パーを数値化して表現しているだけだと言う事です。

こうしたプログラムを作るためには、まず変数にどうやって代入する(数値を入れる)かを分かっていなくてはなりません。
まずは基本的な考え方から説明します。

こちらをみてください。

a = 10;

C言語のプログラムで「=」(イコール)記号を見つけたらまずは=を隔てた右辺と左辺に分割してください。
この場合は、右辺が10で左辺がaです。
左辺に10などのような定数がくることはありません。左辺は必ず変数がくることになっています。

ですから

10 = a; /* 間違い */

は間違いです。

基本的な考え方としては、左辺にある定数や計算式の結果が右辺にある変数と一致すると憶えてください。
一致するといいましたが、

a = 10;

を実行したあと、変数aの内容が10に変わる。ということです。
変数の値が変化することを代入(だいにゅう)と呼んでいます。

色々な代入式がありますが、まずは=を隔てて右辺側の内容が左辺の変数に入ってくるという感じになります。

例えば、

a = 10;
b = a * 2;

という式は最初に変数aに10が代入され、次に変数bにa*2の計算結果(すなわち20)が代入されるという流れになります。

代入式の省略形

代入式には省略して記述ができます。以下は全て省略形です。

元の式 省略形
a = a + 1; a++;(インクリメント)
a = a – 1; a–;(デクリメント)
a = a + 10; a += 10;
a = a – 10; a -= 10;
a = a * 10; a *= 10;
a = a / 10; a /= 10;
a = a % 10; a %= 10;
a = a << 1; a <<= 1;
a = a >> 1; a >>= 1;

上記のa++;ですが、a += 1;と書いても、a = a + 1; と書いても処理内容は同じです。
ただしa++;と記述する方が処理速度は速くなります。デクリメント(a–;)についても同様です。
1ずつ加算するインクリメントと1ずつ減算するデクリメントは、それぞれa++;とa–;と記述した場合に限りコンピュータでは実行速度が速くなります。使用頻度が高いから、というのがその理由です。

インクリメントとデクリメントについての補足

インクリメント(a++;)とデクリメント(a–;)にはそれぞれ前置き記述が存在します。(通常は後置き記述です)
++a;–a;です。

a++;も++a;もa = a + 1;の省略形であることに変わりはありませんが、加算と減算のタイミングが違います。
次のプログラムで確認できます。

後置きインクリメントの場合。

サンプルプログラム usiro.c

#include <stdio.h>
int main(void)
{
	int a = 1;
	
	printf("a = %d\n", a++);	/* この時点ではaは1のまま */
	printf("a = %d\n", a);	/* 次の処理で+1される */
	
	return 0;
}

解説
a++;は、実行時点では+1されません。次の処理に移るタイミングで+1されます。

実行結果

a = 1
a = 2

前置きインクリメントの場合。

サンプルプログラム mae.c

#include <stdio.h>
int main(void)
{
	int a = 1;
	
	printf("a = %d\n", ++a);	/* この時点でaが+1される */
	printf("a = %d\n", a);
	
	return 0;
}
a = 2
a = 2

前置きはめったに目にする機会がないかもしれませんが、処理が大きく違ってくるので確認しておいてください。
ループ処理(for文やwhile文)では基本的に後置き(i++;)が使われています。

コメント

タイトルとURLをコピーしました