c および c++ で次の for ループを使用することは合法ですか?
for(double d=2.0; d<3.1; d+=0.1)
これは、C99 および C++ の正当な構文です。d
そして、ループ内で不適切にいじられない限り、決定論的です (終了する必要があります) 。
ループは実際に終了しますが、ループの反復が正確に何回発生するかは不明です。12 回目の反復で、 の値はd
、理論的には にインクリメントされますが、丸めにより (または同様のもの) または (または同様のもの) になる可能性があります3.1
。そのため、ループが 11 回反復するか 12 回反復するかは不明です。浮動小数点での正確な一致に依存したくありません。3.099999..
3.1000...01
次のものも使用できます
for(char c='a'; c<'A'; c+=1)
printf("%c", c);
これは C および C++ では有効ですが、浮動小数点を理解して適切に使用しない限り、期待どおりの動作をしない可能性があります。
丸めにより、 の値がd
目的のエンドポイントとわずかに異なる可能性があるため、状況に応じて、ループが 1 回の反復を希望より多かれ少なかれ実行する場合があります。(特に、最も一般的に使用されている浮動小数点形式では、3.1 も .1 も正確に表現できません。ソース テキスト3.1
と.1
は近似値に変換されます。)
通常、ループ制御に整数を使用し、各反復で整数から浮動小数点値を計算するなど、一連の浮動小数点値を使用するループを記述するより良い方法があります。(代わりに、ループ制御に浮動小数点オブジェクトを使用できますが、ループ式には整数値のみを使用するように注意してください。)
はい、制限はありません。C++ では、反復子を使用して for ループを作成することも非常に一般的です。
C++ (Microsoft VC++) では、これで問題ありません。
ただし、cでは、変数dを事前に、つまり関数の先頭で宣言する必要があると思います。
cでは合法のようです!! ループ外で変数 d を宣言することもできます。