WhizzClocks
@WhizzClocks

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

if文 複数条件の場合、どちらが良いのか? 入れ子 or 論理演算子&& C言語

解決したいこと

C言語のif文に関するコードの適切な書き方を知りたいです。

例えば、

a) a = 1, b = 2, c = 3, d = 4という条件の時は、ABCと出力しなさい。
b) a = 2, b = 2, c = 3, d = 4という条件の時は、DEFと出力しなさい。
c) a = 2, b = 2, c = 3, d = 2という条件の時は、GHIと出力しなさい。
d) a = 3という条件の時は、JKLと出力しなさい。

という指示があった場合、

// ① 羅列していく
if(a == 1 && b == 2 && c == 3 && d == 4){
 // ABCと出力する処理
}else if(a == 2 && b == 2 && c == 3 && d == 4){
.
.
.

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

// ② 入れ子を使う
if(b == 2 && c == 3 && d == 4){
 if(a == 1){
     // ABCと出力する処理
 }else if(a == 2){
     // DEFと出力する処理
 }
}
.
.
.

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

// ③ returnを活用する
if(a == 1 && b == 2 && c == 3 && d == 4){
 // ABCと出力する処理
 return 0;
}

if(a == 2 && b == 2 && c == 3 && d == 4){
 // DEFと出力する処理
 return 0;
}
.
.
.


などが考えられますが、どんな書き方が適切ですか?

0

3Answer

前提として①と②の比較と①と③の比較では,異なる論点での議論が必要になりますので,この3つのうちどれが一番良いか,をいきなり論ずることはできません.前者は比較条件の最適化について,後者は主にearly returnなどの是非についての議論になります.

前者の比較条件の書き方については,計算量はともかくとしてフローチャートの書き方によっても書き方が分かれるところです.前提としている条件が大きければ,入れ子にすることで意味を分かりやすくできることあります.1

後者に関してはあまりにも分岐後の処理が長くなるような場合,個人的には先に関数を切り出すことを検討すべきと思います.
他で言うとreturnでの途中脱出は文字通りそこで処理が終わるため,コードを読む際に例外処理だとか,何らか逸脱した状況であると意識することがあります.2

繰り返しになりますがこれらは全く異なる議論になってしまうため,どれが良いかはその時によるとしか言えません.特に速度ばかり貴んでいるとかネストを嫌ってばかりいるとかだと読めるコードは書けませんので…
計算量や可読性,例外への対処性など改善したい方向性を狙って書き換える(refactor)ことになります.

いかなる状況でもコーディング規約がある場合は,それに従ってください.

  1. なお,回路設計なんかの低レイヤーではなるべく条件を最適化することなんかも課題にあがりますがまずはあんまり気にしなくていいです.

  2. ことmainでいきなりreturn 0;とか書かれてたらちょっとビックリすると思います.ほんとにそれは正常終了で大丈夫か??

1Like

こういう a,b,c,d みたいな,それらが何なのか全く謎な例では,【「適切」とは? 何について「適切/不適切」という話をするのか?】に関する判断材料が何も無い.
何が「適切」なのかは背景事情次第なので,そういう例では何も言えない.

例えば「a が何かの大分類であり,bがその中での中分類で,cがさらにその中での…」みたいな話だとすれば「最初に a で分岐し,その分岐先で b で分岐し…」という形のコードが「見やすい」とか何とかいう理由において良いのかもしれないし.

あるいは,話が今後どれだけ変わり得る(と想定される)のか? みたいな面の話もある.
どこぞのプログラミングの問題みたいなのを解いている場面であれば好きに書けば良いだけだが,そういうのではなくて,どうにも条件が今後変わるかもしれない(と思われるような)場面において,現時点で

② 入れ子を使う

みたいな書き方をするべきか否か,みたいな.
このような実装をしていると話が変わってしまった場合の修正が厄介になりそうであるから

① 羅列していく

というシンプルな形にしておいた方が(修正が容易であろうと思われるという意味で)その状況下では「適切」と考えるかもしれない.

1Like

ご回答ありがとうございます。
前提条件、場面設定を記述すべきでした。
アドバイスありがとうございます!

0Like

Your answer might help someone💌