実質的に無限に見える「for」ループ 質問する

実質的に無限に見える「for」ループ 質問する

現在、いくつかのコードをデバッグしているのですが、次の行に遭遇しました:

for (std::size_t j = M; j <= M; --j)

(休暇中の上司が書きました。)

私には本当に奇妙に見えます。

それは何をするのでしょうか? 私には、無限ループのように見えます。

ベストアンサー1

std::size_tC++ 標準では、unsigned型であることが保証されています。また、型を 0 から減算するとunsigned、その結果がその型の最大値になることが標準で保証されています。

Mラップされた値は常に1以上なので、ループは終了します。

したがって、型j <= Mに適用すると、unsigned「ループをゼロまで実行して停止する」という便利な方法になります。

代替案としては、j必要な数よりも大きい値を実行することや、スライドオペレーター for (std::size_t j = M + 1; j --> 0; ){他にもいくつか方法があり、これらはおそらくより明確ですが、より多くの入力が必要です。ただし、1 つの欠点は (最初に調べたときに混乱を招く効果以外に)、Java などの符号なし型を持たない言語にうまく移植できないことです。

また、上司が選択したスキームは、unsignedセットから可能な値を「借用」していることにも注意してください。この場合、Mset to はstd::numeric_limits<std::size_t>::max()正しく動作しないことになります。実際、その場合、ループは無限である(それがあなたが観察しているものですか?)コードにその旨のコメントを挿入し、場合によってはその特定の条件でアサートする必要があります。


1 で M はないこと を条件とする std::numeric_limits<std::size_t>::max()

おすすめ記事