現在、いくつかのコードをデバッグしているのですが、次の行に遭遇しました:
for (std::size_t j = M; j <= M; --j)
(休暇中の上司が書きました。)
私には本当に奇妙に見えます。
それは何をするのでしょうか? 私には、無限ループのように見えます。
ベストアンサー1
std::size_t
C++ 標準では、unsigned
型であることが保証されています。また、型を 0 から減算するとunsigned
、その結果がその型の最大値になることが標準で保証されています。
M
ラップされた値は常に1以上なので、ループは終了します。
したがって、型j <= M
に適用すると、unsigned
「ループをゼロまで実行して停止する」という便利な方法になります。
代替案としては、j
必要な数よりも大きい値を実行することや、スライドオペレーター for (std::size_t j = M + 1; j --> 0; ){
他にもいくつか方法があり、これらはおそらくより明確ですが、より多くの入力が必要です。ただし、1 つの欠点は (最初に調べたときに混乱を招く効果以外に)、Java などの符号なし型を持たない言語にうまく移植できないことです。
また、上司が選択したスキームは、unsigned
セットから可能な値を「借用」していることにも注意してください。この場合、M
set to はstd::numeric_limits<std::size_t>::max()
正しく動作しないことになります。実際、その場合、ループは無限である(それがあなたが観察しているものですか?)コードにその旨のコメントを挿入し、場合によってはその特定の条件でアサートする必要があります。
1 で
M
はないこと を条件とする
std::numeric_limits<std::size_t>::max()
。