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

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

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

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

Q&A

解決済

5回答

847閲覧

javascriptのforの疑問です

hisayan

総合スコア60

JavaScript

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

1グッド

1クリップ

投稿2019/08/31 00:31

javascript

1for(let count = 0;count<1;count++){ 2console.log("こんにちは"); 3} 4 5for(let count = 0;count<1;++count){ 6console.log("こんにちは"); 7}

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

Lhankor_Mhy👍を押しています

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

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

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

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

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

m.ts10806

2019/08/31 03:34

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

回答5

0

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/08/31 01:50

querykuma

総合スコア777

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

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

hisayan

2019/09/01 04:03

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

0

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

投稿2019/08/31 01:30

Lhankor_Mhy

総合スコア36074

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

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

think49

2019/08/31 02:57

> 3.aで評価されるのは3番目の式?ではなくて2番目の式?です。 「式?」と書いているのは「式ではない要素」があるからでしょうか。 ES2020 13.7.4.7 には、"for(LexicalDeclarationExpression;Expression)Statement" とありましたが、読み逃した部分があるのかな… https://tc39.es/ecma262/#sec-for-statement-runtime-semantics-labelledevaluation
Lhankor_Mhy

2019/08/31 03:21 編集

for( LexicalDeclaration Expression; Expression ) Statement について、 LexicalDeclaration の文法表現は LetOrConst BindingList; で、Declaration または (varの場合は)Variable Statement だと認識していましたが、違いましたか?
Lhankor_Mhy

2019/08/31 03:22

あ、var の場合はまた別の文法規則なのか……
Lhankor_Mhy

2019/08/31 03:37

あ、そうか、think49さんがおっしゃるのは、2番目は式しかありえないだろう、ということなんですね? for ( 定義; 式; 式 ) 文 の構文では、式は2つしかないので「3番目の式」という言葉を使うのに躊躇した、ということなんです。 わかりにくくてすみません。
think49

2019/08/31 04:20 編集

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

2019/09/01 07:00

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

0

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

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

投稿2019/08/31 01:02

maisumakun

総合スコア145183

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

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

0

ベストアンサー

こんにちは

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

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

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

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

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

  • 後置インクリメント(for の条件式でインクリメントする)

javascript

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

javascript

1for (let count = 0; ++ count < 1; ) { 2 console.log("こんにちは"); // 1回も表示されない。 3}

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

  • 後置インクリメント(while の条件式でインクリメントする)

javascript

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

javascript

1let count = 0; 2while (++ count < 1) { 3 console.log("こんにちは"); // 1回も表示されない。 4}

  

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

  • 後置インクリメント(for の条件式でインクリメントせず、加算式でインクリメントする)

javascript

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

javascript

1for (let count = 0; count< 1; ++ count ){ 2 console.log("こんにちは"); // 1回表示される。 3}

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

  • 後置インクリメント(while の条件式でインクリメントせず、ループ本体の最後にインクリメントする)

javascript

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

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

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

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

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

 

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

参考になれば幸いです。

投稿2019/08/31 03:10

編集2019/08/31 03:44
jun68ykt

総合スコア9058

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

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

hisayan

2019/09/01 04:02

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

0

for 文

JavaScript

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

両コード共に、

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

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

インクリメント

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

Re: hisayan さん

投稿2019/08/31 00:56

編集2019/08/31 01:05
think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問