for文を使うときに, 必ずと言っていいほど現れる変数i(カウンタ変数というらしい).
プログラミングの講義で,for文とはこういうものだと習った際には,for文中で宣言・初期化をいっぺんに行っていた.
//N: 適当な数
for(int i=0; i<N; i++){
//適当な処理
}
ある日,プログラミングとはまた別の科目で,先生のコードを見る機会があったのだが,その先生は先に変数iを宣言していた.
//N: 適当な数
int i;
for(i=0; i<N; i++){
//適当な処理
}
講義で習った書き方だけが正解だと思い込んでいた私にとって先生verは新鮮で,しばらくの間先生verで書くのがマイブームとなっていた.
この2通りの書き方に差はあるのだろうか.
動作は変わらないが,iの扱いは違う
for文そのものの動作は変わらない.どちらで書こうとも,N回<適当な処理>が実行されることに変わりはない.
//N: 適当な数
for(int i=0; i<N; i++){
//適当な処理
}
しかし,for文の中で宣言をした場合は,この変数iはfor文の中でしか参照できない.
//N: 適当な数
for(int i=0; i<N; i++){
i++;
}
System.out.println(i); //Javaの標準出力メソッド
対して,for文の外で変数iを宣言すると,その関数内であるならば参照することができる.
//N: 適当な数
int i;
for(i=0; i<N; i++){
i++;
}
System.out.println(i); //Javaの標準出力メソッド
以降は,調べて分かったことをまとめる.
【結論】繰り返すだけならfor文の中で書くべき
調べた結果,繰り返しをしたいだけなら,for文の中で宣言・初期化をいっぺんに行うべきということが分かった.繰り返しをしたいだけ即ち変数iをカウントするためだけに使いたい場合は,for文の外で呼び出せる必要がない.
for文の外で宣言することで,また他のfor文で変数iを使いまわすことができるから効率の良いコードになるのではないかと思いもしたが,それはプログラム設計において良い習慣ではないらしい.
具体的には,「スコープ」という概念が関わっている.
スコープ
「スコープ」とは,ある変数や関数が参照できる「範囲」のことである.
そして,プログラムを設計する際は,「スコープ」はできる限り小さくするべきという設計思想がある.
「スコープ」を小さくすることで,関数間などの依存度を下げることができる.プログラムを見直す機会や変更を加える機会があったときに容易になるからだ.
今回の変数iも複数のfor文で使いまわすとすると,それらのfor文は,1つの変数iに依存していることになる.この程度のコードで「可読性が...」,「メンテナンス性が...」とまではならないとは思うが,今後のためにもfor文の中で宣言・初期化をいっぺんに行うことを習慣づけたい.