[解決済み] do {...} while ( )」ループの必要性はあるのでしょうか?
質問
Bjarne Stroustrup (C++ の作者) はかつて、自分は "do/while" ループを避け、代わりに "while" ループでコードを記述することを好むと言いました。[以下の引用を参照]。
これを聞いてから、私はこれが真実であることを知りました。 皆さんはどう思われますか? 代わりに"while"を使うよりも、"do/while"の方がずっときれいでわかりやすい例ってありますか?
いくつかの回答に対して:はい、私は "do/while" と "while" の技術的な違いについて理解しています。 これは、可読性とループを含むコードの構造化に関するより深い質問です。
別の方法で質問させてください。仮に "do/while" の使用が禁止されていたとします。
C++プログラミング言語」6.3.3より。
私の経験では、do-statementはエラーと混乱の元である。 その理由は、条件が評価される前に、その本体が常に一度だけ実行されるからです。 しかし、本体が正しく動作するためには、1回目でも条件に非常によく似たものが保持されていなければなりません。 私は、プログラムが最初に書かれテストされたとき、あるいはその前のコードが修正された後で、その条件が期待通りに保持されないことを、想像以上に頻繁に発見してきました。 その結果、私はdo-statementsを避ける傾向があります。 -Bjarne
do/whileループを回避することは、"Do/While "メソッドに含まれる推奨事項です。 C++コア・ガイドライン として ES.75, do-statementsの回避 .
どのように解決するのですか?
do whileループがwhileループに書き換えられることには同意しますが、常にwhileループを使用する方が良いということには同意しません。do whileは少なくとも一度は実行され、それは非常に有用な特性です(最も典型的な例は、キーボードからの入力チェックです)。
#include <stdio.h>
int main() {
char c;
do {
printf("enter a number");
scanf("%c", &c);
} while (c < '0' || c > '9');
}
もちろんこれはwhileループに書き換えることができますが、通常はこちらの方がよりエレガントなソリューションと見なされます。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] Bashでの単一行whileループの構文
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。