質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

524閲覧

for文に続くif文の処理

Demerara

総合スコア397

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/07/27 10:16

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
下記のコードの結果が5になる理由がわかりません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Javascript
for (i = 0; i < 3; i++) {
i = i + 1;
}
if ( i % 2 === 0 ) {
++i;
} else {
--i;
}
alert(i);

### 試したこと for文の結果、iの値は3になり、if文の結果falseを返すので値は2になると思います。 しかしながら、実際にコードを実行するとfor文の結果は3になりますが、そのあとのif文の結果は5になります。 3%2===0はfalseなので値がマイナスされて2になるはずだと思ったんですが、5になるのはどういう理由からなんでしょうか? 仮にfor文の中にif文が含まれていたとしてもfor文で値が1になり、if文でfalseを返すので0に戻り計算が永遠に終わりません。 いくら考えてもiの値が3を超える理由がわからなかったので質問させていただきました。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

まず、for の結果が3 というのが勘違いかと思います。結果(for 文を抜けた後の i の値)は 4 になります。

そのため、条件 i % 2 === 0true となってさらに加算され、最終的に 5 になります。

for分の処理の流れを展開すると、以下のようになります。

javascript

1i = 0 // for 文の初期化処理 i=0 2i = i + 1 // for 文の中の処理 i = 1 3i++ // for 文の繰り返し処理 i = 2 4i < 3 // for 文の条件判定 = true により繰り返し 5i = i + 1 // for 文の中の処理 i = 3 6i++ // for 文の繰り返し処理 i = 4 7i < 3 // for 文の条件判定 = false により、繰り返し終了 8// 以降if文へ

ポイントは、for 文の繰り返し処理に i++ を記載しておきながら、for 文の中の処理に i = i + 1 を記載してしまったがために、一回のループで i の値が 2 ずつ上がっている点にあります。そのため、i は常に偶数となり、 if の条件判定の結果は常に true となります。

投稿2019/07/27 10:26

R.Mizukami

総合スコア1086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Demerara

2019/07/27 12:59

for文を抜ける時にi++となることをすっかり失念してました。 大変わかりやすかったです。ありがとうございました。
guest

0

forループ中にループ変数に代入すると意味不明な挙動になるのでご法度だと思いますが、

javascript

1for (i = 0; i < 3; i++) { 2 console.log("1:"+i) 3 i = i + 1; 4 console.log("2:"+i) 5} 6console.log("3:"+i) 7 8if ( i % 2 === 0 ) { 9 ++i; 10} else { 11 --i; 12} 13alert(i);

こうやってfor文中および抜けたタイミングでiの値がどう変化したのかを追えばわかるんじゃないですかね。

投稿2019/07/27 10:26

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Demerara

2019/07/27 13:22

回答ありがとうざいます。 回答にあるコードの意味がわからず、また暫く頭を抱えていましたが、"1:"や"2:"というのは処理の順番ということですね。1番目の位置では値は0、2番目の位置では1。理解した上で見るとこちらの回答も大変わかりやすいです。ありがとうございました。
guest

0

for文を抜けた時点ではi は4となります
1行づつどう動作するのか追っていきましょう。

投稿2019/07/27 10:20

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Demerara

2019/07/27 13:12

回答ありがとうざいます。 1行ずつ何度も考えたのですが、for文の部分だけをコンソールに打ってEnterを押すと3と出力されるので混乱してしまいました。
guest

0

JSという言語が自由すぎて元ソースでも動いてしまうようですがバグの温床にしかなりません。
もっとスコープを意識した書き方にしましょう。

let result = 0 for (let i = 0; i < 3; i++) { result += i } if (result % 2 === 0) { result++ } else { result-- } alert(result)

これであれば2になるはずです。

投稿2019/07/27 10:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/27 10:22

変数宣言時は必ずletかconstをつけましょう。
Demerara

2019/07/27 13:08

回答ありがとうございます。 上記のコードはsololearnというアプリで出題された問題で、5という正解に納得がいかなく実際に試したりあれこれ考えたりしたんですが、全くわからなかったので質問させていただきました。 アドバイスは自身でコードを書く際の参考にします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問