for文の中に分岐を作って計算するのと、if文を先に書いてからfor文にするのとではどちらが一般的ですか?
for ( i = 0; i < n; i++)
{
if ( a > b ) {
y = i;
} else {
y = i * 2;
}
printf( "%d", y );
}
とするか、
if ( a > b ) {
for ( i = 0; i < n; i++)
{
y = i;
}
} else {
for ( i = 0; i < n; i++)
{
y = i * 2;
}
}
printf( "%d", y );
とするかという事です。
ちなみにプログラムは適当ですのでちょっとしたミスはご勘弁ください。
個人的には後者の方が分岐が少ない分負担は減ると思うのですが、前者の方がすっきりとしているのでこちらを使いたいのです。
もちろん、微々たる差なので好きな方を使えという意見もあると思いますが、皆さんはどちらを使いますか?
No.6
- 回答日時:
場合というか、やりたい処理によって変わると思います。
#2さんのご指摘と被りますが
(a > b)の結果に関わらず、forループは常にn回と決まっている場合、
つまりループ回数が分岐の結果に依存しない処理であれば
前者を採用するほうが理に適っていると思います。
逆に、分岐の結果がループ回数を変えてしまう「かもしれない」場合
後者を採用するほうがいいと思います。
# ただしそのままでは採用はしませんが・・・(後述)
体裁だけ見ると「同じforループが2回あって無駄」ではありますが
今のところ、たまたま回数が同じなだけ・・・というわけです。
将来、何らかの修正で変わることがありえるなら
こうしておいたほうが修正箇所が少なくて済みますよね。
(前者なら、後者に書き換えないといけなくなります)
ただ、ステップ数の多い後者をいきなり選択するような事は、普通しません。
私ならforループを関数化して後者の方法を取ります。
本当に保守のことを考えているなら、下手なコメントより関数化がベターだと思います。
No.5
- 回答日時:
>後者の方で作ってみることにします。
私的な意見ですので参考程度で。。。
他の方同様、場合によるという回答になりますが、
この程度のコードであれば、コンパイラの最適化によって、
最終的なバイナリ、動作はどちらで記述しても、
殆ど変わらない事が多いと思います。
本当にシビアな環境以外で、わざわざ見づらく判り難いコードを
書くことはすごいことでも、なんでもないですし、
結局、コメントを書いて汚すか、判りやすく効率悪そうに
書くかの違いなのでどっちがいいというのもないと思います。
#保守という意味ではわたしは前者を勧めます。
すいません、なにを思ったか前者と書くつもりが後者と書いていました。(下のコメントです)
とりあえず、前者で書いてみました。
ありがとうございました。
No.4
- 回答日時:
場合によります
for ( i = 0; i < n; i++)
{
if ( a > b ) { y = i; }
else { y = i * 2; }
c = y + 5;
d = c + y + 2;
if ( a > b ) { e = c + d + y; }
else { e = c + d; }
f = y + c + e;
g = f + c;
if ( a > b ) { e = g - d; }
else { e = c - d + y; }
printf( "%d", g );
}
かなり極端ですが、内容がまったく違うなら
後者の方がわかり易い場合もあるという例
No.2ベストアンサー
- 回答日時:
基本は、「同じ(ほとんど同じ)ものが複数存在すると、必ず矛盾が発生する」という言葉に集約できるかなと思います。
後者の場合、i < n じゃなくて、i <= n だったなんていうときにどちらか一方の修正を漏らして、なおかつ、テストで、片方のループしか検証できていなかったなどということは起こりがちです。
また、コンパイラやコンピュータの負担が多い少ないは、本当にそれを考えなければならいほどシビアなときだけ気にすればOKです。
たいていの場合、最近のコンパイラは、普通のプログラマよりよっぽどうまく最適化をしてくれたりしますし。
あと、条件を整える → 実行する という2段階もありです。
この例だと、
int scale = (a > b) ? 1 : 2;
for(i = 0; i < n; i++)
{
y = i * scale;
}
printf( "%d", y );
たとえば、こんな感じ。
わかりやすい解説ありがとうございます。
最後のプログラムなんですが
>int scale = (a > b) ? 1 : 2;
これはaがbより大きければscaleに1を代入して、そうでなければ2を代入する
という意味でよろしいですか?
初めて見る記述だったので検索してみたのですが見つからなくて…。
No.1
- 回答日時:
回答ではありませんが、私的意見としてご覧下さいませ
確かに、プログラムの負荷を考えると後者のコードになるかと思います。
しかし、見易さを考えると断然前者のコードになります。
パフォーマンスを求められるプログラムの場合、または
少しでも負荷を軽減しなければならないシステムの場合は
やむなく後者を選択するかと思います。
が、後の保守の事を考えて前者にするのが一般的と思われます。
後者のコードを記述する場合でも、しっかりコメントを挿入すれば
良いかと思われます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語forループが完結した場合...
-
For文の終了値を関数にしても問...
-
ループを途中で抜けたいのですが。
-
UWSCにてある一定の動作を無限...
-
C言語に関する質問
-
C言語のwhile()文での大括弧の...
-
PIC のプログラムについて ど...
-
n重のfor文にするには?
-
excel VBA if文について
-
CASLIIについて
-
whileの途中で手続きを変化する...
-
do-while文が禁止される理由
-
Delphiで・・・
-
for文while文の無限ループの違...
-
if文の中にfor文なのか、for文...
-
2÷3などの余りについて
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
「Aに対するBの割合」と「Aに対...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
for文while文の無限ループの違...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
入力した数値を倍々するプログラム
-
Cプログラムが終了しない
-
n重のfor文にするには?
-
UWSCにてある一定の動作を無限...
-
PIC のプログラムについて ど...
-
Excel VBAで年度をまたぐ期間の...
-
アルゴリズムです!四つの数字...
-
Delphiで・・・
-
While文の終わりにセミコロンが...
-
ループの特定入力終了
-
For~Nextステートメントの終了...
おすすめ情報