Shunk

Shunk/C言語から学ぶ「反復処理『for』」

Created Wed, 17 Jul 2024 08:57:33 +0900
2424 Words 11 min

今回からはプログラミングの三大制御構文の一つの「反復処理」を説明していく。 初回の今回は、反復処理の書き方の中でも基本と呼べる「for」文の書き方からやっていこう。

反復処理とは

プログラミングは基本的な三つの制御構造を組み合わせて作られるということは説明してきた。 その中の制御構文の一つが「反復処理」だ。 (そして個人的には最も難しいと思っている)

反復処理とは、簡単に言うと、何度も同じ処理を繰り返す時に使われるものだ。 例えば、同じ処理を〇〇回繰り返したいときや、成功するまで何回も繰り返したいときなどに使える書き方となっている。

反復処理の書き方は実は4つある。

  1. for
  2. while
  3. do-while
  4. goto

この中で最も基本となるのはfor文だ。 実際のコードの中でもforが出てくることが圧倒的に多い。

今回はそのfor文を使って反復処理を学んでいこう。

書き方

まずは書き方を見てみる。

簡略化すると以下のように書く。

for (繰り返す回数についての条件指定) {
    実際に行う処理
}

この中で繰り返す回数についての条件指定の部分が曖昧だ。

条件指定には三つの要素が入っている

  1. 条件に使うための「キー」となる変数
  2. ループ処理自体を終わらせるか判断するための「条件式」
  3. それぞれのループの終わりに行う「処理」

三つの要素は ; で区切られる

実際のコードを見るとイメージが掴めるだろう Helloを10回出力するコードを書いてみる。

// 10回繰り返すという指定
for (int index = 1; index <= 10; index = index + 1) {
    // 実際に繰り返す処理
	printf("Hello\n");
}

「実際に繰り返す処理」の部分はprintfなので省略する。

しかし繰り返す回数についての条件指定の部分は意味不明だ

(int index = 1; index <=10; index + 1)

これは分解すると、三つのものが ; で区切られている

一つ目は「キー」

int index = 1

これは最初にindexと言う名前のint型の変数を宣言して、1を代入している。先ほど説明した「キー」がindexとなる。

二つ目は「条件式」

index <= 10 

これはindex <= 10が満たされている間はループを繰り返し続けるという意味だ。

indexというキーが10以下ならループは終了しないという「条件式」を定義している。

三つ目は「処理」

index = index + 1

それぞれのループが終わった時にはindexに1を足して更新すると言う意味だ。

上記の三つが揃うと以下のようなループの指定になる

  1. キーはindexで最初の値は1だ
  2. indexが10になるまではループを繰り返す
  3. それぞれのループが終わった時にはindexに1を足す

10回繰り返す処理を定義したい時にはこのように書く。

ここで最初のコードをもう一度見てみよう

// Helloを10回出力するコード
for (int index = 1; index <= 10; index = index + 1) {
    printf("Hello\n");
}

少しだけイメージが掴めてきただろう。

実際の使われ方を見てみる

for文の書き方の基礎を理解できたところで、実際にfor文が使われている箇所を見てみよう。

postgresというOSSのデータベースのソースコードの一部がこれだ。(参照箇所)

OSSとは

今回例に出したpostgresは有名なOSSの一つだ。

OSSとは正式にはOpen Source Softwareの略である。

厳密な定義は長くなるので、興味があれば以下のサイトを見て欲しい 参考

簡単に説明すると、世の中に無料で公開されており、有志のプログラマたちが協力して開発と運用を行なっているソフトウェアのことだ。

個人的な感想だが、技術者独自の素敵な文化だと思う。

		for (i = 0; i < 10; i++)
		{
			if (useOr)
				s1 = s1 + s2 - s1 * s2;
			else
				s1 = s1 * s2;
		}

実際にしている処理はわからなくて大丈夫だが、for文の条件分岐のところは理解しなくてはならない。

for (i = 0; i < 10; i++)

ここだ。

実はこの書き方は先ほどの例と同じで、10回繰り返すと言うことを定義している。

しかし4つ違いがある。

  1. indexをiと略している
  2. iが0から始まっている
  3. 条件分岐で <= ではなく **<**を使っている
  4. 処理の部分がi = i + 1ではなく i++と言う書き方になっている

これは全てコードを簡潔に書くための工夫だ。

  1. indexをiと略している

indexをiと略すのはわかりやすい。よく使われるものは省略しても読み手に伝わるからだ。

  1. iが0から始まっている
  2. 条件分岐で <= ではなく **<**を使っている

次にiが0から始まっていることと、、条件分岐に<を使っていることはペアになっている。 10回繰り返すためには「1から始まって10まで繰り返す」が一番わかりやすいが、「0から始まって9まで繰り返す」でも同じことになるし、「9まで」を示すのに「<=9」より「<10」の方が短い。

さらに言うなら10回繰り返すコードなので10と言う数字を使った方が直感的にわかりやすいのでこのような書き方になっていると考えられる。

  1. 処理の部分がi = i + 1ではなく、i++と言う書き方になっている

そして最後の++と言う書き方は新しい書き方なので次のセクションで詳しく説明する。

インクリメント, デクリメント

++と言う書き方はインクリメントと呼ばれる書き方だ。

これは、よく使われる処理を簡略化して書くための、省略記法となっている。

i++

i = i + 1

と同じ意味だ。

こういうふうに書くこともできるのだということを覚えておこう。

そして++だけではなく

i--

という書き方も存在している。 これはデクリメントと呼ばれ、先ほどの++の真逆の意味となる。

つまり

i = i - 1

と同じだ。

細かいインクリメントとデクリメントの話は別の記事にまとめることとするが、一旦for文が読めるようになっただろう。

コラム: 無限ループ

初心者がよく恐れるものの中に無限ループと呼ばれるものがある。 無限ループに陥ってしまうことで、パソコンが壊れると考える人もいるが 最近のパソコンは無限ループ如きで壊れるものはほとんどない。

というか、意図した無限ループ処理は実は日常でよく使われている。

電源を切るまでずっと起動している類の機器は大抵中で無限ループの処理を行うことでずっと起動続けているのだ。 ATMとか、