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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

918閲覧

C++における for文中で回すiをスコープ内のwhile文の条件式で使った時の仕様について

bell96

総合スコア13

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/13 06:26

C++で約数の数を数えるプログラムを作っていた時にわからなくなりました。
for文で扱うパラメータをその中のwhile文で扱う時の仕様について教えていただきたいです。

例えば10!が2という素因数をいくつもつか調べるために次のようなプログラムを書きました。

C++

1 int N=10; 2 int cnt=0; 3 int prime=2; 4 5 for(int j=2; j<=N; j++){ 6 while(j%prime==0){ 7 cnt++; 8 j/=prime; 9 } 10 } 11 12 cout << cnt << endl;

しかしこのプログラムは最初のwhile文の中で永遠にループしてしまいます。恐らくfor文のパラメータであるjをwhile文で使っていることにボトルネックがある気がしたので、次のようなコードを書いてみました。

C++

1 int N=10; 2 int cnt=0; 3 int prime=2; 4 5 for(int j=2; j<=N; j++){ 6 int a=j; 7 while(a%prime==0){ 8 cnt++; 9 a/=prime; 10 } 11 } 12 13 cout << cnt << endl;

すると今度は無限ループに入らずにcnt=8を返してくれました。
ちなみにpython3だと最初のコードのような方法で書いても正常に動作します

python

1N=10 2cnt=0 3prime=2 4for i in range(2,N+1): 5 while i%prime == 0: 6 i /= prime 7 cnt += 1 8 9 10print(cnt)

C++のはじめのコードでうまくいかない理由を教えていただけないでしょうか?
また、なぜpythonだと同じように書いてもうまくいくのでしょうか?
よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

自分で変数の値がどうなるか追っかけていけば。
無限ループするようなコードを書けばそうなるのは当たり前です。
VisualStudioやEclipseなどのステップ実行できる実行環境を用意して、どういう動作になるのか追っかけてみればどうでしょう

投稿2019/02/13 06:33

編集2019/02/13 06:36
y_waiwai

総合スコア87719

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

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

bell96

2019/02/13 06:39

回答ありがとうございます。 while文のブロックをコメントアウトすると無限ループはしないので、あなたの言っていることは間違いかと思われます。
bell96

2019/02/13 06:59

無限ループの原因になっているのはwhile文中でループカウンタを小さくしてることで、実際に無限ループをしているのはfor文でした。自分が間違っていました。すみません。
guest

0

落語の「時そば」をご存知ですか?

「おい、蕎麦屋さん。生憎と、細けえ銭っきゃ持ってねえんだ。落としちゃいけねえ、手え出してくれ」と言って、主人の掌に一文銭を一枚一枚数えながら、テンポ良く乗せていく。「一(ひい)、二(ふう)、三(みい)、四(よう)、五(いつ)、六(むう)、七(なな)、八(やあ)」と数えたところで、「今何時(なんどき)でい!」と時刻を尋ねる。主人が「へい、九(ここの)つでい」と応えると間髪入れずに「十(とう)、十一、十二、十三、十四、十五、十六、御馳走様」と続けて16文を数え上げ、すぐさま店を去る。つまり、代金の一文をごまかしたのである。

時そば - Wikipedia

このように繰り返し処理のカウントをする変数を、ループカウンタと言います。
ループの中でループカウンタを操作するのは、あまりいい結果を生まないです。

投稿2019/02/13 06:41

Lhankor_Mhy

総合スコア35869

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

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

bell96

2019/02/13 06:48

ループ内でループカウンタをいじることの問題点がよくわかる例え話でした。ありがとうございました。
guest

0

for(int j=2; j<=N; j++){

この書き方はループの継続条件として j<=Nという式が使われています。
つまり毎ループごとにj<=Nを評価し、trueであればループ内へ、falseであればループを抜けるという判定を行っています。

ループ内の処理で変数jを変更し、j<=Nがいつまでたってもtrueになるようでしたら、結果的に無限ループとなります。

自己解決されているように。

int a=j;

と変数jを変更しない書き方であれば、期待した結果になります。

また、for in 系はそもそも毎ループごとにループの継続条件を評価することがありません(ちょっと自信ありませんが)。
決まった範囲の値がループ変数に代入されて処理されるだけです。

投稿2019/02/13 06:38

takabosoft

総合スコア8356

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

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

bell96

2019/02/13 06:49

他の方も指摘してくださっているようにpythonのfor in系は少し違っているみたいで、それを基準に考えていたので今回のような間違いをしてしまったようです。回答ありがとうございました。助かりました。
hayataka2049

2019/02/13 07:57

>for in 系はそもそも毎ループごとにループの継続条件を評価することがありません pythonのforの場合はイテレータに対するループですが、イテレータの要素が尽きた状態で次の要素を取り出そうとするとStopIteration例外が出ます。forはその例外を拾ってループを終える仕組みです。
guest

0

ベストアンサー

Pythonのfor文

Python

1for i in range(N): 2 do_something(i)

このコードは、次のように書いているのと動作は同じです。

Python

1it = iter(range(N)) 2while True: 3 try: 4 i = next(it) 5 except StopIteration: 6 break 7 8 do_something(i)

あくまで巡回対象はイテレータであって、iはただの代入先でしかありません。
iに新しい値を代入しても、次の周回で上書きされます。

Cのfor文

C

1for(int i = 0; i < N; ++i) { 2 do_something(i); 3}

このコードは、次のように書いているのと動作は同じです。

C

1int i = 0; 2while(i < N) { 3 do_something(i); 4 ++i; 5}

ループ内でiの値を書き換えると、継続条件や次の周回のiの値に影響します。

投稿2019/02/13 06:35

編集2019/02/13 06:36
LouiS0616

総合スコア35658

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

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

bell96

2019/02/13 06:53

pythonのfor in系を当たり前だと思っていたことで今回の普通のfor文を間違えてしまったので、両者の違いを教えてくださったのは問題の急所をつく大変ありがたい回答でした。よって今回のベストアンサーに選ばさせていただきました。回答ありがとうございました。
guest

0

for文の理解が足りていないと思われます。最初のコードは下記とほぼ同じです。

C++

1 int j=2 2 while(j<=N){ 3 while(j%prime==0){ 4 cnt++; 5 j/=prime; 6 } 7 j++; 8 }

Pythonのfor inとは全く意味が異なります。

投稿2019/02/13 06:35

otn

総合スコア84423

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

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

bell96

2019/02/13 06:51

はい。for文に対する理解が浅かったです。そのコードだとおかしいのはよくわかります。 回答ありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問