私はパフォーマンスに渡します:しかし構文とメンテナンスに2つの重要な違いがあります(ヒントを証明するために生成されたIRまたはアセンブリをチェックし、違いはありませんが)。
構文
i
変数の範囲が異なっています。 while
場合には、ループ後に利用可能である間for
場合、i
は、for
ヘッダと体内でのみアクセス可能です。原則として、範囲が狭く、変数が少ない方が良い飛行機は、コーディング時に心配する文脈が少ないことを意味します。
メンテナンス
for
ループ操作が一緒に閉じるすべての反復をグループ化するニートという利点を有するので、それらはワンショットで検査等を確認することができます。カウンタはもはや実装されているとして、無限ループ:while
場合
for(int i = 0; i != 10; ++i) {
if (array[i] == nullptr) { continue; }
// act on it
}
int i = 0;
while (i != 10) {
if (array[i] == nullptr) { continue; }
// act on it
++i;
}
、continue
の導入は、バグを作成しました:
はまた、
continue
文を導入する一つの重要な違いはありません。
インパクト
for
ループが定期反復パターンについて、より読みやすく、すべての周り優れています。さらに良いことに、C++ 11の範囲-のための文で:あなたがいない台無しに確信しているので、反復が完全に、コンパイラによって考慮される
for (Item const& item : collection) {
}
! corrolaryでは
を(退却を開始し、それはfor_each
アルゴリズムは多少議論の余地なります...と私たちはフォームの古いを望むことができます):while
ループは不規則な繰り返しパターンに予約する必要があり、この方法は、彼らは、コードレビューの際に特別の注意を引き付けると、将来のメンテナーから強調表示不規則性の場合。
速度のためのopmizingに設定されたコンパイラは 'print(i)'を5回だけ発行し、ループを完全に排除するかもしれません。両方の場合において。 – Joey
現実世界では、コードの読みやすさを調べ、それに応じて 'for'または' while'を選択します。コンパイラは、その差を最適化します。あるいは、現代の機械ではその差はごくわずかです。コンピュータの「生活」ではなく、あなたの人生を楽にするものを使用してください。 – Bazzz
、最適化するように設定されていない場合は?? – wali