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

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

ただいまの
回答率

87.78%

javascriptのforの疑問です

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 1,462

score 20

for(let count = 0;count<1;count++){
console.log("こんにちは");
}

for(let count = 0;count<1;++count){
console.log("こんにちは");
}


最初の記述は「こんにちは」1回は予想できたのですが、2番目の記述は「こんにちは」が2回になると思うのですが、なりません。
これはfor自体がwhileの場合と比べて制限が厳密と考えればよいのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • querykuma

    2019/08/31 10:43

    この質問に初心者マークを付けていただけますか?
    https://teratail-v2.storage.googleapis.com/assets/img/tour/03.mp4?1566365738722466
    https://teratail.com/tour

    キャンセル

  • m.ts10806

    2019/08/31 12:34

    予想も何も書いた通りにしか動かないので結果が全てですよ。

    キャンセル

回答 5

+5

for文の説明なら任せてください。
teratailの他の質問でfor文の制御フローを解説するために作成した図です。

for文の説明

増減の部分が++countでもcount++でも終了条件に影響しません。

for(let count = 0;count<1;count++){
  console.log("こんにちは");
}

for(let count = 0;count<1;++count){
  console.log("こんにちは");
}

for(let count = 0;count<1;count=count+1){
  console.log("こんにちは");
}

for(let count = 0;count<1;count+=1){
  console.log("こんにちは");
}


4つとも同じ繰り返し回数になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/01 13:03

    分かりやすい図解をありがとうございました。

    キャンセル

+4

count++++countの違いは、この式自体を利用した場合の値(a = b++;a = ++b;aの値が違う)だけです。

forの3つ目に書いた式は評価はされるものの値は使われないので、count++++countで何も変わりません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+4

こういう時は仕様を見るのが一番ですね。
ECMAScript® 2020 Language Specification
3.fで3番目の式?が評価されますが、評価値は用いられていないことがわかります。3.aで評価されるのは3番目の式?ではなくて2番目の式?です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/31 12:37

    あ、そうか、think49さんがおっしゃるのは、2番目は式しかありえないだろう、ということなんですね?

    for ( 定義; 式; 式 ) 文
    の構文では、式は2つしかないので「3番目の式」という言葉を使うのに躊躇した、ということなんです。
    わかりにくくてすみません。

    キャンセル

  • 2019/08/31 13:18 編集

    質問の意図はご推察通りで「式?」の「?」が曖昧性を表していると思ったのですが、その意図が不明だったので尋ねました。
    この「?」は「式」を否定するものではなくて、「何番目」かで戸惑いがあったのですね。

    ES2020の「13.7.4.7 -> IterationStatement:for(LexicalDeclarationExpression;Expression)Statement -> 11.」を参照してみると、
    https://tc39.es/ecma262/#sec-for-statement-runtime-semantics-labelledevaluation

    > 11. Let bodyResult be ForBodyEvaluation(the first Expression, the second Expression, Statement, perIterationLets, labelSet).

    とあるので、仕様に従うと、「1番目の式 = count<1」「2番目の式 = ++count」という扱いになりますね。

    キャンセル

  • 2019/09/01 16:00

    おっしゃるとおりです。
    ただ、何の説明もなくそれを「1番目の式」と書くと誤解の元だろうと思いまして、結局「式っぽいものの2番目」という意味合いで「?」をつけました。表現が難しいですね。

    キャンセル

checkベストアンサー

+2

こんにちは

以下の回答では、 説明の便宜上、

  • for (・・・) { } の ・・・ の部分を、 MDNのfor 文の説明にそって、 セミコロンで区切った3つの式を各々、 for (初期化式条件式加算式) と呼ぶことにします。
  • 同様に、 while(・・・) { } についても、式 ・・・ を条件式 と呼ぶことにします。

以下は、 インクリメント演算子(++)についての、MDN からの引用です。

インクリメント (++)
 インクリメント演算子は数値を 1 ずつ加算し、値を返します。
 ・オペランドの後に演算子を置く後置記法 (例: x++) で使った場合、加算する前の値を返します。
 ・オペランドの前に演算子を置く前置記法 (例: ++x) で使った場合、加算した後の値を返します。

上記の確認のため、ご質問に挙げられている for を使ったコードを、 count ++ と ++ count とで、結果が異なるように修正するならば、加算式でインクリメントせずに、以下のように、条件式でインクリメントするようにします。

  • 後置インクリメント(for の条件式でインクリメントする)
for (let count = 0; count ++ < 1; ) {
  console.log("こんにちは"); // 1回表示される。
}
  • 前置インクリメント(for の条件式でインクリメントする)
for (let count = 0; ++ count < 1; ) {
  console.log("こんにちは"); // 1回も表示されない。
}

上記の2つを while を使って書き直すと、それぞれ以下になります。

  • 後置インクリメント(while の条件式でインクリメントする)
let count = 0;
while (count ++ < 1) {
  console.log("こんにちは");  // 1回表示される。
}
  • 前置インクリメント(while の条件式でインクリメントする)
let count = 0;
while (++ count < 1) {
  console.log("こんにちは");  // 1回も表示されない。
}

  
 
ご質問に提示されている、以下の2つのコード

  • 後置インクリメント(for の条件式でインクリメントせず、加算式でインクリメントする)
for (let count = 0; count < 1; count ++ ){
  console.log("こんにちは"); // 1回表示される。
}
  • 前置インクリメント(for の条件式でインクリメントせず、加算式でインクリメントする)
for (let count = 0; count< 1; ++ count ){
  console.log("こんにちは"); // 1回表示される。
}


を while で書き直せば、以下のように、後置インクリメントが返す値と前置インクリメントが返す値との差が、ループ継続の判定に影響しないものになります。

  • 後置インクリメント(while の条件式でインクリメントせず、ループ本体の最後にインクリメントする)
let count = 0;
while (count < 1) {
  console.log("こんにちは"); // 1回表示される。
  count ++;
}
  • 前置インクリメント(while の条件式でインクリメントせず、ループ本体の最後にインクリメントする)
let count = 0;
while (count < 1) {
  console.log("こんにちは"); // 1回表示される。
  ++ count;
}

以上を整理すると、以下の3点です。

インクリメント演算子は数値を 1 ずつ加算し、値を返します。

と書かれています。つまり、インクリメント演算子を使うことによって返される値がある、ということです。

  • 後置インクリメントと前置インクリメントとで差異が生じるのは、この返される値を使ったときです。上記に挙げた全8点のコードうち前半4点はその例になっています。
     

  • 条件式でインクリメントしないコード(後半の4点)では、返される値を使っていないので、前置と後置とで同じ結果("こんにちは" と1回表示される)になります。

参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/01 13:02

    詳しい解説をありがとうございました。

    キャンセル

+1

for 文

for(let count = 0;count<1;count++);
for(let count = 0;count<1;++count);

両コード共に、

  • 繰り返し条件式は count<1
  • 繰り返し開始時の処理はインクリメント(1を加算)

なので、繰り返し回数は変わりません。

インクリメント

インクリメントの過去質問。

Re: hisayan さん

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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