1. ホーム
  2. c++

[解決済み] 実質的に無限と思われるforループ

2023-07-18 14:25:14

質問

現在、あるコードをデバッグしているのですが、このような行に出くわしました。

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

(休日出勤の上司が書きました)

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

これはどうなっているのでしょうか?私には、無限ループのように見えます。

どのように解決するのですか?

std::size_t は、C++標準によって保証されているのは unsigned 型であることが保証されています。また、デクリメントする場合は unsigned 型を0からデクリメントする場合、標準はその結果がその型の最大の値であることを保証しています。

その包み込むような値は、常に M 1 で、ループは終了します。

そこで j <= M に適用すると unsigned 型に適用された場合、"ループをゼロまで実行してから停止する"を表す便利な方法です。

を実行するような代替案は j を一つ大きくして、さらに スライド演算子 for (std::size_t j = M + 1; j --> 0; ){ があり、これはより多くの型付けを必要とするものの、間違いなくより明確です。しかし、1 つの欠点は (最初に見たときに困惑させる効果以外に)、Java などの符号なし型を持たない言語にはうまく移植できないことだと思います。

また、あなたの上司が選んだスキームは unsigned セットから可能な値を借用しています。 M に設定された std::numeric_limits<std::size_t>::max() に設定すると、正しい動作になりません。 実際、その場合、ループは無限大になります。 . (それはあなたが観察していることですか?) あなたはコードにその旨のコメントを挿入すべきですし、場合によってはその特定の条件についてアサーションすることも必要でしょう。


1 対象 M ない std::numeric_limits<std::size_t>::max() .