[解決済み] 実質的に無限と思われるforループ
質問
現在、あるコードをデバッグしているのですが、このような行に出くわしました。
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()
.
関連
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 型付けされた関数ポインタ?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++11のT&&(ダブルアンパサンド)の意味とは?
-
[解決済み] int argc, char *argv[] とはどういう意味ですか?
-
[解決済み] Visual Studioでコマンドラインパラメータを使ったデバッグを行う
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】mapがキーに値を含むかどうかを判断する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない