人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: lionfan2
●カテゴリ:学習・教育
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● cdaotg
●10ポイント

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

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

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


lionfan2さんのコメント
id:cdaotg様、ありがとうございます。了解です。 JavaScriptの授業で学生に、先週はfor文を教え、今週はwhile文なのです。教科書ではforとwhileは、飛車と角のように、しばしば対になって教えられているのですが、自分の経験では、for文に比べ、while文ってめったに使わないよね・・・と思っていたので、プロの方に実際のところを聞いてみたかったのです。自分の感覚が、それほど間違っていなかったようでうれしいです。

2 ● a-kuma3
●50ポイント ベストアンサー

だいたいの感覚でいいのですが、ある期間にあなたが書いた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 くらいがせいぜい。

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

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


lionfan2さんのコメント
id:a-kuma3様、多くの言語について、それぞれ理由と例をつけての解説、ありがとうございます。たいへん参考になりました!! すばらしい回答でした。

a-kuma3さんのコメント
No.4 さんの回答を見て、ぼくも実際の数値を確認してみたくなりました。 |* |*for|*while|*while (for : 100)| |c :通信系|<div style="text-align:right;">335</div>|<div style="text-align:right;">49</div>|<div style="text-align:right;">14.6</div>| |c :画面系|<div style="text-align:right;">184</div>|<div style="text-align:right;">33</div>|<div style="text-align:right;">17.9</div>| |c++ :数値計算|<div style="text-align:right;">3291</div>|<div style="text-align:right;">527</div>|<div style="text-align:right;">16.0</div>| |java :画面系|<div style="text-align:right;">2564</div>|<div style="text-align:right;">835</div>|<div style="text-align:right;">32.6</div>| <br> 思ってたよりも、for の回数が多いです(当てにならない感覚だ)。 調べてみると、本数で1/3 から半分がテスト用のコードなんですが、その中にたくさん for が書いてありました。 テストケースを構造体の配列で持っていて、それをループさせてテスト対象を呼び出してる、みたいな。 思ってた以上に for を書いているようです (^^;

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

3 ● nattow
●5ポイント

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

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


lionfan2さんのコメント
nattow様、ありがとうございます。了解です。

4 ● practicalscheme
●50ポイント

手元にあったプロジェクトの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の方が素直にマップできる、ということはありそうです)


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

1-5件表示/6件
4.前の5件|次5件6.
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ