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

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

ただいまの
回答率

87.35%

for以下の実行結果がピンときません

解決済

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 1,458

score 20

for(let count = 10;count=0;count--){
console.log(count);
}

この記述の実行結果が
10 9 8 7 6 5 4 3 2 1 
になるような気がするのですが、実行しても全く反応がありません。
なぜ反応しないのかがピンときません。
間違っているからなのですが、この間違いが分かりません。
count=0をcount>=0にすればうまくいくのですが、count=0自体が間違いであると考えればよいのでしょうか。

<うまくいった場合の例>
for(let count = 10;count>=0;count--){
console.log(count);
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takasima20

    2019/10/01 07:47

    終了条件が count=0 はたぶん count==0 のつもりなのかな。

    キャンセル

  • nullpot

    2019/10/01 08:00

    直接質問者さんへの回答でなくて申し訳ないのですが、質問者さんも勘違いなさっているポイントなのでこちらに書きます。同時にtakasima20さんも勘違いなさっているようなのですが、「終了条件」ではなく、ここの「条件が満たされるとき(=true)」にループ内に行く条件なのです

    キャンセル

  • m.ts10806

    2019/10/01 08:57 編集

    書いた通りにしか動きませんよ。
    「思った通り」には動きません。

    って前に何度か指摘しているので(「気がする」ではないです)、見直してください。
    思いや気持ちで動くものではありません。

    キャンセル

  • querykuma

    2019/10/01 14:04 編集

    代入式count=0と比較式count===0の違いはわかりますか?

    キャンセル

回答 5

+8

count=0代入式です。この式を判定した瞬間に、countには0が代入され、そして0はfalsyなのでループを外れます。

逆にここをcount=1のようにした場合、ループ変数をどう変更しようがここで1に書き戻されてしまうので、無限ループとなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/01 17:40

    横槍失礼します。
    forのその箇所に、代入式を入れると、
    代入された変数自体の値から論理値判定する、という解釈でよろしいでしょうか?
    今更ながらかなり勉強になりましたので、思わず質問でした。

    キャンセル

  • 2019/10/01 17:44

    はい、どんな式を入れても、式の値を評価するという点で挙動は全く同じです。

    代入式の結果は、代入した値そのものになります。

    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Assignment_Operators#Assignment_2

    キャンセル

  • 2019/10/01 17:56

    なるほど!
    大変にありがとうございます!!
    また、基礎からも欠かさず勉強していこうと思いました。

    キャンセル

+2

count=0のような式は「条件式」と呼ばれ「繰り返しを続ける条件」となります。

「もしcount=0だったら繰り返しを続ける」
というのはおかしいですよね?
「もしcount>=0だったら繰り返しを続ける」というのはどうでしょうか。
しっくり(?)くるのでは...

参考
MDN

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-4

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for

for ([initialization]; [condition]; [final-expression]) statement

condition
ループの各反復の前に評価される式。もしこの式が true に評価されるなら、statement が実行されます。この条件テストは省略可能です。もし省略されたなら、条件は常に true に評価されます。もしこの式が false に評価されるなら、実行は for の構成子に続く最初の式に飛びます。

というわけで、
count=0の場合、countは0ではないので、ループ終了となります。
count>=0でうまく行ったのは、最初のループでcountは0以上だったためで、ループが回るうちに0を下回って、ループが終了します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/01 09:31 編集

    > count=0の場合、countは0ではないので、ループ終了

    残念ながら解釈が違います
    count=0の場合、countは0となり、count=0の式の戻り値が0
    つまりfalseなので条件に合致しなくなるのでループが終了します。
    (ちなみに低評価をつけたのは私ではありません)

    キャンセル

-5

teratailの他の質問でfor文の制御フローを解説するために作成した図です。

for文の説明

count=0count>=0は違うものです。
count=0は変数への値の代入という式です。変数countに値0を代入しています。結果の値は常に0です。
count>=0は比較して結果の値を得る式です。比較演算子>=count0の大きさを比較してtrue(yes)false(no)を返しています。

for文の終了条件のところは代入ではなく条件式を入れてください。

count==0count===0は変数countが値0と等しいか比較してtrue(yes)false(no)を返す式です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/01 14:49 編集

    作成したときベストな表現が見つかりませんでした。
    ループの終了条件をみていますがYのとき終了するとしていません。
    フローチャートも終了条件式の結果がNならループを終了としています。

    キャンセル

  • 2019/10/01 17:27

    代入文を直したら低評価が-1に戻っていました。
    3つ低評価がついていますがなぜでしょう?
    無言で付けないでください。
    nullpotさんの回答やMDNにありますように条件(condition)としました。
    ループ本体を1回も実行しない(継続しない)ときがあると思いました。

    キャンセル

  • 2019/10/05 02:20 編集

    おそらく、緑の増減というのが間違っているのかと・・・。
    一つ目の式が変数の初期化、二つめの部分が条件(式なりなんなりの値の評価)という部分はなんとなく意味あいも合っていますが、
    三つ目の緑の増減は、増減ではなく、
    二つ目の式(というか値)が真となった場合、三つ目の式を実行した上でブロック内の処理を実行する、という仕様のようです。
    よって、三つ目には、増減以外の式を入れることも可能です。

    for (let i = 0; i < 10; i = 1) {
    // 無限ループ
    }

    のようにです。
    増減や条件というよりは、
    forの()内のものは、
    一つ目が最初の一回、
    二つ目は繰り返しの度その後の三つ目とブロック内を実行するかを値によって評価、
    三つ目は、二つ目が真の場合に実行する
    ということなのでしょう。

    キャンセル

check解決した方法

-8

for(let count = 10;count=0;count--){
console.log(count);
}

初期値countが10、countが0の場合は-1をやり続けなさい。
初期値のcountが10で、countが0という条件に当てはまらないので何もしない。

皆様ありがとうございました。ご指摘のことを色々試してForの知識が深まりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/03 13:24

    解釈がまだ微妙に違います。
    maisumakunさん達の回答をもっとよく読んで、噛み砕いていきましょう。
    ポイントは、forのその箇所はあくまで値の評価(true or falseか、それに互換する値を評価)をしているだけなのと、
    count = 0は条件ではない、ということを理解して下さい。

    キャンセル

  • 2019/10/07 15:01

    もう解決したとのことですが、これを見た人が間違わないように...
    誤りのある文
    => 誤:初期値のcountが10で、countが0という条件に当てはまらないので何もしない。
    →正:初期値のcountが10で、条件式がcount=0という代入式の為、戻り値が0になる。(代入式は代入した値が戻り値になる。)
    0は真偽値の解釈ではfalseの為、条件式がfalseになる。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る