【Go言語】くるくるまわれ For ループ - For その1

2018年10月23日Gofor,Go言語,インクリメント,デクリメント,ループ,制御文Go,Go言語,インクリメント,デクリメント,ループ,制御文

さぁ~今回もうっしーの学習記録。

「A Tour of Go」を使って「Go」を進めていきます。

遅い更新頻度ではありますが、いよいよ新章となりまして、今回からは制御文な章に突入していくようです。

新章の学習内容

さて、新章のタイトルですが「Flow control statements: for, if, else, switch and defer」となっています。

A Tour of Go - Flow control - statements, for, if, else, switch and defer
A Tour of Go – Flow control – statements, for, if, else, switch and defer

「Flow control statements」ってのは、「流れを制御する命令文」的な意味になるかと思います。

つまり~、プログラム中における処理の順番を制御するための命令文たちってことですね。

何かしらの言語をかじったことがあれば「あ~あれね(´ε` )」程度のものなんですが、自分の復習という意味も込めて噛み砕いて書いてみました。

そしてこの章からは…

  • for
  • if/else
  • switch
  • defer

と、大まかに4つの制御分を学習するようです。

まぁ、章立てのお話はこの辺にして今回のお題に入ります。

今回のお題は「For」

URLおいておきますねっ…と。(´・ω・)つhttps://go-tour-jp.appspot.com/flowcontrol/1

A Tour of Go - For のページ
A Tour of Go – For のページ

内容を見てみる

制御文一発めってことで、ループ制御の「for」文が解説されているようです。

ポイントを抜き出してみる

ページ内の説明は何時も通り1分ほどで読めました。

ここでのポイントをザックリ纏めてみると…

  • for文の文法
  • 初期化ステートメント
  • 条件式
  • 後処理ステートメント

でしょうかね?

それじゃ一個一個見ていきます。

for文の文法

Go の for 文は、「初期化ステートメント」、「条件式」、「後処理ステートメント」の順番セミコロンで区切って書くようです。

for <初期化ステートメント>; <条件式>; <後処理ステートメント> {
    :
    :
}

「A Tour of Go」の Note 部分にも記載がありますが、他の言語だと、「初期化ステートメント」から「後処理ステートメント」までを丸かっこ(()←これね)でくくることが多いですが、Go では要らないようです。

それじゃ「初期化ステートメント」から詳しく見ていきます。

初期化ステートメント

まず、ページに記載されている説明を見てみます。

初期化ステートメント: 最初のイテレーション(繰り返し)の前に初期化が実行されます

初期化ステートメントは、短い変数宣言によく利用します。その変数は for ステートメントのスコープ内でのみ有効です。

とまぁ、書いてある通りなんですが、ループ内で使うためのカウンタ用変数などを初期化するときなどによく使います。

// 初期化ステートメント
for <変数名> ;= <初期化値> ; <条件式>; <後処理ステートメント> {
    ~~~~~~~~~~~~~~~~~~~~~~~
//  ↑初期化ステートメント
    :
    :
}

// e.g.
for i := 0; <条件式>; <後処理ステートメント> {
    :
    :
}

それとこれも書いてあるとおりなんですが、初期化ステートメントで宣言した変数は、For 文の中(ループ内)でのみ有効です。

つまり、ループを抜けると変数は使えなくなるので注意ですね。

条件式

これもまずは解説を見てみます。

条件式: イテレーション毎に評価されます

ループは、条件式の評価が false となった場合にイテレーションを停止します。

条件式とは、ループを継続させるための条件付けになり、条件式が真の状態(条件を満たしている)、もしくは true が指定されている限り継続するようです。

逆にループを終了させるためには、条件式を偽の状態(条件を満たさない)、もしくは false が指定されることで終了するってことですね。

// 条件式
for <初期化ステートメント> ; <数式 | bool値>; <後処理ステートメント> {
                           ~~~~~~~~~~~~~~~~~
//                         ↑条件式
    :
    :
}

// e.g. 1
// この場合、変数 i が 10 より小さければループ継続
for i := 0; i < 10; <後処理ステートメント> {
    :
    :
}

// e.g. 2
// この場合、変数 i が true ならループ継続…
// 無限ループっぽくなるが、こんな書き方はしなさそう(^_^;)
for i := true; i; {
    :
    :
}

// e.g. 2 の余談…
// 条件を省略すれば無限ループになる
for {
    :
    :
}

後処理ステートメント

解説ではこうなってます。

後処理ステートメント: イテレーション毎の最後に実行されます

つまり、毎ループの最後に実行する処理を指定する部分になります。

よく使うのはカウンタ用変数のインクリメント(1足すことね)やデクリメント(1引くことね)で使用します。

// 後処理ステートメント
for <初期化ステートメント> ; <条件式>; <計算式など> {
                                     ~~~~~~~~~~~~~~
//                                   ↑後処理ステートメント
    :
    :
}

// e.g.
// この場合、毎ループの最後に変数 i が +1 される
for i := 0; i < 10; i++ {
    :
    :
}

ちょっと本題からそれますが、インクリメントとデクリメントについてです。

変数に1加算する場合…

i = i + 1

となりますが、こういった1加算や1減算という処理は使用頻度が高く、専用の書き方が用意されていることが多いんですね。

それが…

i++(インクリメント)

i--(デクリメント)

よく使うので覚えておくといいと思います。

さて、本題に戻りまして!

後処理ステートメントでは、終了条件と結びついているカウンタ用変数をインクリメント、もしくはデクリメントして、終了条件を満たすために使われることが多いです。

というわけで、for 文の使い方を一通り確認できましたので、次にサンプルプログラムを見てみます。

サンプルプログラムを見てみる

付属のサンプルプログラムを見てみます。


処理ごとにコメントを挟んでみましたが、プログラムの目的として、ループカウンタ用の変数をループ毎に足しこんでいって、合計値を出力する簡単なプログラムのようです。

Run してみると結果は 45 が出力されます。

ループ毎にそれぞれの値を追っていくと……

1回目のループ:sum = 、i= →sum += i の結果は

2回目のループ:sum = 、i= →sum += i の結果は

3回目のループ:sum = 、i= →sum += i の結果は

4回目のループ:sum = 、i= →sum += i の結果は

5回目のループ:sum = 、i= →sum += i の結果は 10

6回目のループ:sum = 10、i= →sum += i の結果は 15

7回目のループ:sum = 15、i= →sum += i の結果は 21

8回目のループ:sum = 21、i= →sum += i の結果は 28

9回目のループ:sum = 28、i= →sum += i の結果は 36

10回目のループ:sum = 36、i= →sum += i の結果は 45

11回めのループ:sum =45、i=10 →条件を満たさないのでループ終了

となり、出力された sum の値は 45 となるわけですね。

今回のまとめ

今回は for 文の基本的な使い方でしたね。

今回やったことをまとめてみますと…

  • for 文の書き方は、for <初期化ステート面tの>; <条件式>; <後処理ステートメント> { … }
  • 初期化ステートメントはループ開始時に1度だけ実行されるんです
  • 初期化ステートメントで宣言した変数はループ内でのみ有効なんです
  • 条件式は真の(条件を満たしている)間だけループが継続するんです
  • 後処理ステートメントは毎ループ後に実行されるんです

それと余談として書いたこれ…

  • インクリメントとは1増加させること、I++ と書くことができる(i = i + 1 と同義)
  • デクリメントとは1減少させること、i– と書くことができる(i = i – 1 と同義)

こんなところでしょうかね。

新章に入ってすこーし内容が濃くなってきた気がしますが、前章に続いて制御文もプログラミングでは基本になり必須項目ですのでね、じっくり覚えていきたいところです。

というわけでっ、今回はここまで。

それじゃ~また次回~。٩(๑´3`๑)۶