
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.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.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.1
- 回答日時:
回答ではありませんが、私的意見としてご覧下さいませ
確かに、プログラムの負荷を考えると後者のコードになるかと思います。
しかし、見易さを考えると断然前者のコードになります。
パフォーマンスを求められるプログラムの場合、または
少しでも負荷を軽減しなければならないシステムの場合は
やむなく後者を選択するかと思います。
が、後の保守の事を考えて前者にするのが一般的と思われます。
後者のコードを記述する場合でも、しっかりコメントを挿入すれば
良いかと思われます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- その他(プログラミング・Web制作) ラムダ式 3 2022/11/28 16:48
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語 1 2022/11/09 13:05
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムで関数は使わない方...
-
フラッシュ暗算
-
do-while文が禁止される理由
-
「Aに対するBの割合」と「Aに対...
-
有効数字について 以前質問をし...
-
C言語での引数の省略方法
-
C言語を実行すると-infが出てき...
-
数学 確率変数Xは、X=2またはX...
-
DWORDの実際の型は何でしょうか
-
ある商品のロス率を5%見込み、...
-
プログラムでの数字につく”f”の...
-
複数桁10進数の*桁目だけを抽出...
-
*をユーザーが入力した数字の数...
-
エクセルの問題です。絶対値の...
-
16進数 加算 減算 C言語
-
2÷3などの余りについて
-
Win32APIでのエディットボック...
-
異なる文字列のマッチングを、D...
-
【指数・対数】
-
Arduinoでコンパイルエラーにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
ループを途中で抜けたいのですが。
-
C言語forループが完結した場合...
-
break文でループを一気に抜ける...
-
C言語、whileループを抜け出す...
-
入力した文字列から母音だけを...
-
プログラムで関数は使わない方...
-
For文の終了値を関数にしても問...
-
Cプログラムが終了しない
-
if文の中にfor文なのか、for文...
-
他言語で言うcontinue文
-
文字列を後ろから1文字ずつ表示...
-
if文を使わずに奇数・偶数を判断
-
整定時間
-
for文while文の無限ループの違...
-
excel VBA if文について
-
n重のfor文にするには?
-
特定の文字列が出てくるまでの...
-
VBScriptでSQLに接続し、CSV出...
おすすめ情報