for文はfor(初期化式; 条件式; 更新式)
という構成になっています。
ループに入るときに一回だけ評価される。省略可能。
ループが一周終わるたびに評価され、偽だとループを抜ける。省略すると恒真扱い。
ループが一周終わるたびに実行される。省略可能。
1)
int s=0;
for(int i=1;i<5;++i) s+=1;
こちらのfor文に関しては、基礎的な使われ方をしているので解説不要でしょう。
ここで私が説明するより、調べた方が有益な情報が多くあるかと思います。
理解しづらい点があるとすれば、加算代入演算でしょうか。
s += 1;
とs = s + 1;
は、同じ意味です。1だけ足して再代入しているのです。
なお、『1だけ増やす』処理をインクリメントと呼び、++s
とも書けます。
2)
int s=0;
for( ;i<5;i++);
s+=1;
for文の初期化式を省略した記法です。
初期化式がありませんので、iはfor文より前に初期化されている必要があります。
また、ループ本体が空節になっています。
(動作を知っていることは大事ですが、読みにくいので真似しない方が良いです。)
次のように書いているのと同じです。
Java
1int s=0;
2for( ;i<5;i++) {
3}
4s+=1;
s += 1;
は**ループ後に呼ばれます。**つまり1回しか呼ばれず、終了時のsは1です。
3)
int s=0
for(int i=1;i<5;s += ++i);
**これは読みづらいですね。**while文に書き直してみましょう。
Java
1int s = 0;
2int i = 1;
3
4while(i < 5) {
5 s += ++i;
6}
上記の2つのコードは、ほぼ同じ動作をします。
また、s += ++i
を展開すると、次のように書けます。
Java
1i = i + 1;
2s = s + i;
前置インクリメントと加算代入が組み合わさって、面倒なことになっていますね。
ちなみにs += i++
を展開すると、次のようになります。
Java
1s = s + i;
2i = i + 1;
これはこういうものなんだと思うしかないです。
リンク先をじっくり読んで、理解を深めるようにしてください。
コメントを受けて
1)for文の初期化式を省略しているという箇所なのですが、省略されているものはint i=0でいいのでしょうか?
0とは限りませんし、iとも限りません。
ループカウンタを使う場合は、前もって初期化しておく必要があります。
Java
1int i = 0;
2for(; i < 4; ++i) {
3}
次のような場合に省略されるように思います。
- ループカウンタをfor文外で利用したい場合
- ループカウンタを必要としない場合 (while文で書いた方が読みやすい気がする)
ループカウンタを前もって初期化しない場合、コンパイルエラーになります。
2)ループが空白だと、iが4になるまで繰り返しが起こらないということですか?それとも、ループの所が空白でもiが4になるまでループは起こるのですか?
良い質問ですね。後者が正しいです。
いわゆる空ループを書く目的は、次の二点かと思います。
- 待ち時間を作りたい場合 (簡潔ではありますが、良い方法だとは思いません。)
- カウンタを外部で宣言しており、それの変化を利用したい場合
後者はしばしば書くことがありますが、無理に使うものでもありません。
もしそのようなコードを見かけましたら、それから動作を追っても遅くないと思います。
『次のループが実行されない!なんで!』というのは初心者あるある質問です。
Java
1for(int i = 0; i < 10; ++i);
2 System.out.println(i);
だからこそ、ひっかけ問題的に取り扱われているのでしょう。
ただ、ひっかかってはいけませんが、他人をひっかけるコードを書いてもなりません。
出来るだけ素直にコードを書くことを意識出来ると良いですね。
質問の仕方について
ここまで何回か用いていますが、teratailにはコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
また、質問に関係ない部分は消してしまった方が見やすいです。
質問をする際は、可能な限り何がわからないのか分析して投稿してください。
プログラムの仕組みが、どうなっているか分からない。
とのことですが、具体的に何がわかって、何がわからないのか、私には判断できません。
わからないことを整理するうちに、自然と自己解決することもあります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/16 03:14
2018/01/16 03:50
2018/01/17 12:41