結構間違ってます。
for文。
プログラムに必須の繰り返し構文、for文ですが、
特に駆け出しエンジニアの方にforの誤用が多いんです!
(※当記事はJavaをベースに書いてありますが、C言語でもまったく同様ですので是非参考にして頂ければと思います。)
「動けばいいじゃん!」
確かに動いてナンボ、動かないコード(プログラム)は「悪」なのですが、
メンテナンス性とか、バグ(不具合)の作りこみやすさとか、そういったことに関わってくるので
中級以上を目指すなら基本を押さえてほしいのです。
ではなにが間違いなのか?
まず、forの実例から見ていきましょう!
for(int i = 0; i < 10; i++) { System.out.println("Hello!"); }
実行結果
Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello! Hello!
“Hello!” が10個表示されてます。
うん。
実に基本のforループ。
何の変哲もないforループ、
なのですが!
ここに押さえておいて基本があります。
それは:
- 0からはじめる!
- ‘<‘ を条件に!
- 繰り返し回数を書く!
ということなのです。
これまで for(int i = 1; i <= 10; i++) みたいに 「<」 よりも 「<=」 を使って書いていませんでしたか?
これでも動くのですが、バグ(不具合)を作りこむ原因になるのでやめてください。ぜひやめてください!
なぜダメなのかは後でご説明します。
今はともかく for(int i = 0; i < 10; i++) のような書き方なのだと素直に覚えておいてくださいね(・∀・)
ただし、
もし、数値そのものが重要であれば次のような書き方をしてください:
このパターンですと例えば5~10まで表示したい場合次のようなプログラムになります:
for(int i = 5; i <= 10; i++) { System.out.println(i); }
実行結果
5 6 7 8 9 10
はい。こんな風に5~10まで表示されました。
なぜ for(int i=1; i<=10; i++) はだめなのか?
なぜfor(i=1; i<=10; i++)じゃダメか?
あ、ちなみに言っておきますと、数値を重視して書いたコード(プログラム)であればいいんです。
ダメと言ってるのは回数を指定したい場合のことです。
なにがダメなのか?
それは配列との関係性にあります。
例えば、次のプログラムを見てください:
public static void main(String[] args) { int a[] = {1, 2, 3, 4, 5}; for(int i = 0; i < 5; i++) { System.out.println(a[i]); } }
実行結果
1 2 3 4 5
これは要素数5の配列を表示するだけのプログラムですが、次のようにも書けます:
public static void main(String[] args) { int a[] = {1, 2, 3, 4, 5}; for(int i = 0; i <= 4; i++) { System.out.println(a[i]); } }
動作は同じですがちょっと違います。
なにが違うかわからないって?
両方の3行目に注目して下さい。
これが最初のやつ:
for(int i = 0; i < 5; i++) {
これがあとのやつ:
for(int i = 0; i <= 4; i++) {
条件の部分が違いますね。「<」 を使うか 「<=」 を使うか。
最初の方は要素数の「5」を意識して書かれているコードです。正しい書き方。
後の方は配列のインデックス(添字)に意識を置いたコードです。動作はするけど「4」という数字に意味が見えてこない。
いやもちろん、インデックスの4だというのはわかりますが、要素数の「5」の方が重要なんです。
だって、5個の要素があって、それを順番に表示する、ということをやりたいのだから「5」というイメージの方が強い。
それを頭で判断して
「インデックスは要素数より1少ないから4だな」
とかやるのはめんどくさい。
プログラム全般に言えるのですが、
コードを見たり書いたりするときに、判断が増えるのはそれだけ
不具合を作りこむ原因になる。
だから、「5」という数字を素直に書けた方がいい。だから最初の
for(int i = 0; i < 5; i++) {
の方がいいんです。
それから、実際に配列をつかうならlengthプロパティを使うのがふつうですから、実務ではこう書くでしょう:
for(int i = 0; i < a.length; i++) {
これがインデックス主体の考え方だと:
for(int i = 0; i <= a.length - 1; i++) {
となってしまってわかりにくい。
だから、for(i=1; i<=10; i++) がだめだと言ったのは、そういうわけなのです。
だたJava SE 5.0 から拡張for文が導入されているからあまり上記のことには悩まされることは少ないとは思います。
上の例を拡張for文で書けば:
public static void main(String[] args) { int a[] = {1, 2, 3, 4, 5}; for(int i : a) { System.out.println(i); } }
となるのであまりインデックスだ要素数だと悩まされることは少ないですけどね。
ただ初心者の方には基本を押さえてから拡張for文に進んでほしいのです。
拡張for文、実務で使っていいんですけど、基本のforがわかってないと、難しい実装(プログラムを書くこと)をするときに困ってしまうことになります。
基本のfor文に慣れていることがいつかきっとあなたを助けることになるでしょう。
まとめ
回数を意識する場合for(int i = 0; i < 10; i++)のように
数値を意識する場合for(int i = 1; i <= 10; i++)のように
判断は少ない方がいい
基本を押さえたら拡張for文に進んでね!