【for文とwhile文の使用比率は?】

プロとしてプログラミングをしている人に質問です(なので、高校生以下は回答してはダメです)。だいたいの感覚でいいのですが、ある期間にあなたが書いたfor文が100回であったとき、その同じ期間に書いたwhile文は何回くらいですか? たとえばfor文の1/5くらいかな、と思ったら 20 と回答してください。理由も教えていただけるとうれしいです。よろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2013/11/11 19:12:47
  • 終了:2013/11/14 10:23:04

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4545ベストアンサー獲得回数18952013/11/11 22:11:50

ポイント50pt

だいたいの感覚でいいのですが、ある期間にあなたが書いたfor文が100回であったとき、その同じ期間に書いたwhile文は何回くらいですか? たとえばfor文の1/5くらいかな、と思ったら 20 と回答してください。

とりあえず、感覚で言えば 100 です。
多分、半々。

何故なら、作っているプログラムの種類と、使う言語によって違ってくるからです。

c / c++


そこそこ大きなプログラムでは、数値計算系と、ネットワークのミドルウェアみたいなのを書いたことがあります。

数値計算系のは、範囲をメッシュで切って順番に処理するのと、繰り返し計算で値が収束するまで繰り返す、という両方のタイプを書いたので、for : while で 3 : 1 くらいだったと思います(あくまで、感覚)。

ネットワーク系のプログラムでは、サーバ側がクライアントからの接続を待つ、とか、接続の際のリトライを行うとか、ほとんどが while です。
接続状態を列挙するとか、状態管理系の部分では for も使いますが、ループするところは共通化してしまいますので、for を使ってる場所は数えるほどしかなかったと思います。

STL なんて便利なものが無かったころは、メモリの管理はリストでやることがほとんど。
「多めに配列を取っておけ」なんて、裕福な家庭の生まれではありませんでしたので。

java


データエントリ系のプログラムを書いたことがあります。
ありていに言えば、伝票系。
やったのが、ちょっと昔だったので 1.4 系でした。
なので Collection 系のイテレータ使うときには、while が定番でした。

    List list = new ArrayList(10);
    Iterator i = list.iterator();
    while (i.hasNext()) {
        ...
    }

みたいな。
いまどきだったら、for each でしょうね。

    List<Foo> list = new ArrayList<Foo>(10);
    for (Foo foo : list) {
        ...
    }

時代が while を使わせた、という感じでしょうか。
# おおげさ

javascript


jQuery なんかを使ってると、for も while もほとんど出てきません。

    var list = document.getElementsByTagName("DIV");
    for (var i = 0 ; i < list.length ; ++i) {
        ...
    }

なんて書いてたのが、いまどきは、

    $("DIV.content").each(function() {
        ...
    });

って感じですから。
Ruby のイテレータと同じ感覚で使えるので、違和感ありません。

Ruby


for の出番は、ほとんどありません。

    list = [...]
    for i in list
        ...
    end

と書けるのですが、普通は、イテレータを使って、こう書きます。

    list = [...]
    list.each { |i|
        ...
    }

決まった回数で回すようなループだって、こう書いてるはずです。

    (0...10).each { |i|
        puts i
    }

    0.step(100, 10) { |i|
        puts i
    }

なので、ファイルの終わりまで読む、とか、接続できるまで繰り返す、というような while ばかりが出てくる感じになります。

シェルスクリプト


オプションの解析は、while getopts が定番。
行単位で処理をするときも、

    ... | while read line
    do
        ...
    done

が定番。

でも、コマンドの結果を、いったんシェル変数に詰め込むときは、for が定番。

    list=`...`
    for item in $list
    do
        ...
    done

for の方がちょっと多いような気もするけど、for : while で 3 : 1 くらいがせいぜい。

あまり、思い入れが無いやつ

  • fortran
    Fortran 77 世代なので DO ばっかり。while て何?

  • VB、VBA
    最大は 10000 件で、それを超えたら知ーらない、がまかり通ることが多い。
    while の終端は何だったっけ……

  • Perl
    ループするようなプログラムを書いたことが、ほとんどありません X-)
    困ったときには、「ねえねえ、Ruby をインストールしても良いかなあ……」って。



# 長々とすんません (^^;

他1件のコメントを見る
id:a-kuma3

No.4 さんの回答を見て、ぼくも実際の数値を確認してみたくなりました。

 forwhilewhile (for : 100)
c :通信系
335
49
14.6
c :画面系
184
33
17.9
c++ :数値計算
3291
527
16.0
java :画面系
2564
835
32.6



思ってたよりも、for の回数が多いです(当てにならない感覚だ)。

調べてみると、本数で1/3 から半分がテスト用のコードなんですが、その中にたくさん for が書いてありました。
テストケースを構造体の配列で持っていて、それをループさせてテスト対象を呼び出してる、みたいな。

思ってた以上に for を書いているようです (^^;

2013/11/12 13:29:36
id:lionfan2

id:a-kuma3様、再度の回答、ありがとうございます。実際のデータは重みがありますね!!

2013/11/13 15:21:09

その他の回答(4件)

id:cdaotg No.1

cdaotg回答回数89ベストアンサー獲得回数232013/11/11 19:38:00

ポイント10pt

多めに見積もって1ですね。

ループの使用方法ですが、インデックスなりIteratorなりを使って配列やリストの全要素を処理する割合がかなり多いです。

なので、while文を使うのはそれ以外の場合ですが、そういうケースは1%も無いかと。

id:lionfan2

id:cdaotg様、ありがとうございます。了解です。

JavaScriptの授業で学生に、先週はfor文を教え、今週はwhile文なのです。教科書ではforとwhileは、飛車と角のように、しばしば対になって教えられているのですが、自分の経験では、for文に比べ、while文ってめったに使わないよね・・・と思っていたので、プロの方に実際のところを聞いてみたかったのです。自分の感覚が、それほど間違っていなかったようでうれしいです。

2013/11/11 20:34:13
id:lionfan2

質問文を編集しました。詳細はこちら

id:a-kuma3 No.2

a-kuma3回答回数4545ベストアンサー獲得回数18952013/11/11 22:11:50ここでベストアンサー

ポイント50pt

だいたいの感覚でいいのですが、ある期間にあなたが書いたfor文が100回であったとき、その同じ期間に書いたwhile文は何回くらいですか? たとえばfor文の1/5くらいかな、と思ったら 20 と回答してください。

とりあえず、感覚で言えば 100 です。
多分、半々。

何故なら、作っているプログラムの種類と、使う言語によって違ってくるからです。

c / c++


そこそこ大きなプログラムでは、数値計算系と、ネットワークのミドルウェアみたいなのを書いたことがあります。

数値計算系のは、範囲をメッシュで切って順番に処理するのと、繰り返し計算で値が収束するまで繰り返す、という両方のタイプを書いたので、for : while で 3 : 1 くらいだったと思います(あくまで、感覚)。

ネットワーク系のプログラムでは、サーバ側がクライアントからの接続を待つ、とか、接続の際のリトライを行うとか、ほとんどが while です。
接続状態を列挙するとか、状態管理系の部分では for も使いますが、ループするところは共通化してしまいますので、for を使ってる場所は数えるほどしかなかったと思います。

STL なんて便利なものが無かったころは、メモリの管理はリストでやることがほとんど。
「多めに配列を取っておけ」なんて、裕福な家庭の生まれではありませんでしたので。

java


データエントリ系のプログラムを書いたことがあります。
ありていに言えば、伝票系。
やったのが、ちょっと昔だったので 1.4 系でした。
なので Collection 系のイテレータ使うときには、while が定番でした。

    List list = new ArrayList(10);
    Iterator i = list.iterator();
    while (i.hasNext()) {
        ...
    }

みたいな。
いまどきだったら、for each でしょうね。

    List<Foo> list = new ArrayList<Foo>(10);
    for (Foo foo : list) {
        ...
    }

時代が while を使わせた、という感じでしょうか。
# おおげさ

javascript


jQuery なんかを使ってると、for も while もほとんど出てきません。

    var list = document.getElementsByTagName("DIV");
    for (var i = 0 ; i < list.length ; ++i) {
        ...
    }

なんて書いてたのが、いまどきは、

    $("DIV.content").each(function() {
        ...
    });

って感じですから。
Ruby のイテレータと同じ感覚で使えるので、違和感ありません。

Ruby


for の出番は、ほとんどありません。

    list = [...]
    for i in list
        ...
    end

と書けるのですが、普通は、イテレータを使って、こう書きます。

    list = [...]
    list.each { |i|
        ...
    }

決まった回数で回すようなループだって、こう書いてるはずです。

    (0...10).each { |i|
        puts i
    }

    0.step(100, 10) { |i|
        puts i
    }

なので、ファイルの終わりまで読む、とか、接続できるまで繰り返す、というような while ばかりが出てくる感じになります。

シェルスクリプト


オプションの解析は、while getopts が定番。
行単位で処理をするときも、

    ... | while read line
    do
        ...
    done

が定番。

でも、コマンドの結果を、いったんシェル変数に詰め込むときは、for が定番。

    list=`...`
    for item in $list
    do
        ...
    done

for の方がちょっと多いような気もするけど、for : while で 3 : 1 くらいがせいぜい。

あまり、思い入れが無いやつ

  • fortran
    Fortran 77 世代なので DO ばっかり。while て何?

  • VB、VBA
    最大は 10000 件で、それを超えたら知ーらない、がまかり通ることが多い。
    while の終端は何だったっけ……

  • Perl
    ループするようなプログラムを書いたことが、ほとんどありません X-)
    困ったときには、「ねえねえ、Ruby をインストールしても良いかなあ……」って。



# 長々とすんません (^^;

他1件のコメントを見る
id:a-kuma3

No.4 さんの回答を見て、ぼくも実際の数値を確認してみたくなりました。

 forwhilewhile (for : 100)
c :通信系
335
49
14.6
c :画面系
184
33
17.9
c++ :数値計算
3291
527
16.0
java :画面系
2564
835
32.6



思ってたよりも、for の回数が多いです(当てにならない感覚だ)。

調べてみると、本数で1/3 から半分がテスト用のコードなんですが、その中にたくさん for が書いてありました。
テストケースを構造体の配列で持っていて、それをループさせてテスト対象を呼び出してる、みたいな。

思ってた以上に for を書いているようです (^^;

2013/11/12 13:29:36
id:lionfan2

id:a-kuma3様、再度の回答、ありがとうございます。実際のデータは重みがありますね!!

2013/11/13 15:21:09
id:nattow No.3

nattow回答回数102ベストアンサー獲得回数272013/11/12 02:04:03

ポイント5pt

しいて言えば 1 以下ですかね。

もっとも、言語にもよりますが昔ながらの(?) for よりも、foreach, Iterator 系の方がはるかに使用頻度が高いですが。

id:lionfan2

nattow様、ありがとうございます。了解です。

2013/11/12 08:16:45
id:practicalscheme No.4

practicalscheme回答回数157ベストアンサー獲得回数422013/11/12 03:59:42

ポイント50pt

手元にあったプロジェクトのC言語部分 (100kLOCくらい) をざっとgrepしたら、for文が938、while文が554でした。もうちょいwhile少ないかなと思っていたので案外多かったですね。このwhileのうち、do {...} while() で使ってるのが198。

ただし、do~whileのうちの124はマクロの展開結果にブロックを入れるための do { ... } while (0) で、これは定型句みたいなものなので除外すべきでしょうね。一方、foreachみたいな自前のマクロを介してforを使ってるパターンが124あるので、意識して使っている量としては for 100に対してwhileは33ってとこです。

(日常の主力言語はSchemeとCommon Lispで、「条件が満たされるまで再帰する」という書き方が多いので、それをCに移す時にwhileの方が素直にマップできる、ということはありそうです)

id:lionfan2

id:practicalscheme様、定量的な回答、ありがとうございます。たいへん参考になりました。id:practicalscheme様の翻訳したポール・グレアムのエッセイ、読み返してたら返事が遅くなってしまいました。

2013/11/12 09:22:50
id:TAK_TAK No.5

tak回答回数998ベストアンサー獲得回数842013/11/13 14:01:42

ポイント20pt

for : while

10 : 1 ぐらいのような気がしていましたが、
今数えたところ

288 : 47 

でした


と、言う訳で答えは  16.319

理由は計算したから、です。

言語はjava のみです。

id:lionfan2

id:tak様、具体的な回答、ありがとうございました。たいへん参考になりました!!

2013/11/13 15:19:33
  • id:gm91
    今は自分でプログラム書かないのでコメントで。

    処理系にもよるんじゃないですかね。組み込み系のS/Wだとエラー処理でWDT待ちにする時whileつかったりしてました。
    基本的に既存品流用しろってのが職場ルールだったので、一般的なコーディング手法なのかはちょっと自信がありませんが。
  • id:Beirii
    少し前に作ったcuda cのソースで調べたところ、for:whileで、8:1でした。
    whileは全て「while(i != 0)」という、cuda cにおける縮約コードにて使用していました。
  • id:kuro-yo
    今は全然違う仕事しているのでコメントで。

    昔、Cで仕事しました。
    ループで使う場合の話限定ですよね?
    断然whileです。while:100に対してfor:1あるかないかって感じですね。
    ですが、ループカウンタ(笑)の更新をし忘れたりしてはまります。ダメグラマーですね(笑)
    forとdo~whileは構文的に美しくないので、あまり使いたくないですね。

    本当は、forが使えるところはforを使った方が、適切なオプチマイズが行われ、実行時のスループットが上がるはずです。
  • id:lionfan2
    id:gm91,id:Beirii様、id:kuro-yo様、ご回答、ありがとうございます。
    もちろん処理系にもよるのだと思いますが、やはりwhile文はfor文よりはマイナー、というのは確認できて良かったです。
  • id:Kityo
     C/C++プログラマーのつもりですが、ここ数年の業務ではプログラマーらしいことは滅多にしません。自分のコーディングスタイルで通して良い場合であれば、whileキーワードは使いませんので、for100に対してwhileはゼロです。
     理由、for文を知っていれば前置while文は必要ない。自分が使う道具は、多くの種類を使い分けようとするよりも、少ない種類を使い込んだほうが良いと考えているので。whileで簡潔(or美しく)書ける制御構造は、forでも同じくらい簡潔かより短く書けるが逆は成り立たないので、forかwhileかの選択ではforを採りました。
  • id:lionfan2
    id:Kityo様、貴重なコメント、ありがとうございます。これまた極端ですね!!
  • id:Kityo
     若者(後輩社員等)にforとwhileの使い分け方について尋ねられたら「迷わずforを使え。そこで迷う分の知恵をコードの品質に回すか・迷う時間分作業を短縮せよ」と指導します。その理由を尋ねられたら、彼の経験の量にもよりますが、大体上のとおりです。
     幸い「whileを使わないでforを重用する」コーディングスタイルを禁止又は非推奨とするコーディング規約には殆ど出会ったことがないため、この件に関しては新規のコーディングでは大体「自分のコーディングスタイルで通して良い場合」に該当します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません