if文で条件文を作るときの最適な方法は?

このQ&Aのポイント
  • if文で条件文を作る際に、どのように書くのが最適なのか悩んでいます。
  • 例えば、性別を判断する場合、データ的には男か女しかありませんが、将来的には不明な値が追加される可能性があります。
  • その場合、elseを付けるべきか、エラー処理を追加するべきか検討しています。
回答を見る
  • ベストアンサー

条件文でelseはつけるべき?

if文で条件文を作るときに、どういう風に作れば最適なのか考えています。 「男」か「女」かを判断する時のif文として、データ的にどちらかしかないので、以下のようになると思います。 --------------------------- if 「男」 {   処理1 } else if 「女」 {   処理2 } --------------------------- 仕様的にもどちらかしかないのですが、こういう場合でもelseを付けた方が良いのでしょうか? --------------------------- if 「男」 {   処理1 } else if 「女」 {   処理2 } else {   エラー処理 } --------------------------- 後々の仕様変更で、判断できない場合は「不明」などが追加される可能性もあると思います。 その場合に、仕様変更に対応してないとエラー処理が動くようにしておくべきでしょうか? みなさんは、必ずelseを書いてますか?

  • rally
  • お礼率61% (339/553)

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 以前仕事で、C のプログラムを大量に作っていました。 その時の経験ですが、予定外の値が与えられた時の処理も必ず考慮して 作成しておくべきです。 チェックするパラメータの数にもよりますが、パラメータ数が多い ようであれば、事前に与えられたパラメータの範囲を全てチェックして しまい、その後にパラメータの値によって処理を切り分ける事を お奨めします。 → その方が、パラメータチェックの部分を集約できますので後々の   修正が楽になります。

rally
質問者

お礼

どちらが最適か、と聞かれると、やはりエラーチェックは、やった方が良いですね。 実装で心がけるのと同時に、設計のときにも注意するようにします。

その他の回答 (7)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.8

状況によります。 1.男女を示すデータが検証済み(他の処理から渡されるなど)の場合 if (男) { ... } else { ... } 2.男女を示すデータが未検証の可能性がある場合 if (男) { ... } else if (女) { ... } else { ... } 通常、「データチェック」と「データ処理本体」は分離する方が効率がよく、メンテナンス性も向上します。 ・同じチェックを何度も記述してしまうことがない ・チェック部分がひとまとめにできる ですから、業務で使うなら圧倒的に2が多いでしょう。 しかし、『必ずどこかで』チェックは行います。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.7

if 「男」 {   処理1 } else {   処理2 } 私ならこんな感じにします。仕事柄処理速度を優先するので・・・ else ifでは再度比較を行うことになるのでその分遅くなります。 結局その変数に「男」or「女」以外の値が入る可能性の 問題なのでしょう。 BOOLだとVC++のMFCのスケルトンコードなどは if (TRUE) {   処理1 } else {   処理2 } ってなってますね。

回答No.6

私だったら、後者ですね。 男と女のふたつしかないというのであれば、 それ以外の値が飛んできたら、システムエラーで、強制終了させます。 仕様で男と女しかなかったのに、途中で、「不明」とかいう値が追加されるかもしれないし・・・ エラー処理って、考えたら、キリがないですよね。 でも、細かくするのが、丁寧なプログラムだと思いますよ。 不正な値が後続処理へ渡るのが一番問題です。

rally
質問者

お礼

> 不正な値が後続処理へ渡るのが一番問題です。 ですね。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.5

結局は「判定すべきデータ」がどれだけ信頼できるかと言う事ですね。 絶対に、2値論理が保証されるならif else でいいし 3値論理になりそうならif else else が必要でしょう。 後々の仕様変更も、その可能性の強さで判断すべきでしょう。 仕様変更云々を言い出すと本当はキリがありません。 仕様変更に強い設計や組み方は必要ですが。 異常対策のelseが必要か、仕様変更に対して何をしておけばよいか 経験で覚える部分が多いです。頑張って下さい。

rally
質問者

お礼

> 異常対策のelseが必要か、仕様変更に対して何をしておけばよいか > 経験で覚える部分が多いです。頑張って下さい。 社内でプログラム標準書を作成しようと思ってるのですが、こういうところもまとめて行きたいと思っています。 後輩に「何で?」と聞かれても答えられるようにしておかなくては・・・

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.4

こんにちは、honiyonです。   muyoshidさんが回答して頂いた内容が最も良い対処方法になります。   なので、「こういう考え方もあるよ」という回答をします。   例えば、1か0で、男・女を表現する場合、「1なら男、0なら女、それ以外は男と仮定する。」という仕様も考えられます。   今回の性別の処理、その他大抵の処理においては、muyoshidさんの方法が最も最適ですが、場合により上記のような「それ以外は○○と仮定」が好都合な時もあります。   逐次入力の再確認を求める事が出来ず、ある程度予測に基づく処理でも悪影響がない場合など(^^;   参考になれば幸いです(..  

rally
質問者

お礼

とにかく、どの値が来ても必ずどれかの制御を通るように対応しておく方が良いってことですね。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.3

if文は、真偽を判定し、それにより処理する命令です。 たとえば、性別に何も入ってない場合があったとしましょう。 そのときは、エラーとしたいならば、2番目の記述のようになると思います。 女としたいならば、1番目の記述ですね。 文法的には、使えないとかいうことはないです。 ただ、それが仕様としてあってるのかどうかですね。 分岐が多いようでしたら、case文というのもあるでしょう。

rally
質問者

お礼

今回の質問は設計するにあたって、どうすればいいのか?っていうのもあります。 今はいいけど、後々・・・。 やはりelseをつけます。

回答No.2

その条件文がどのような場面で使われるかによるかと思います。 ユーザーからの入力チェックを行う場面であれば、elseは必要だと思いますし、確実に「男」or「女」の値をとりえる場面(内部でコード化され既にチェック済みなど)であれば必要なように思えます。 また仕様変更の件ですが、現在の仕様が「仕様変更に対応してないとエラー処理が動く」であればelseが必要かと思います。 いかがでしょう?

rally
質問者

お礼

仕様的には「男」「女」は無いと考えていいのですが、仕様変更を見据えてelseを書くことにします。

関連するQ&A

  • if else文のフローチャート

    c言語です。 if else文のフローチャートを教えてほしいです。 Trueの場合は処理1、Falseの場合は処理2を実行したいです。 最初に条件と書きます。

  • if文の分岐をelseにする事ができません。

    以下のような定義の構造体があります。 この構造体のメンバであるchar型配列Cが、 【実行】にあるようにif文で使われている時にelseの処理2を実行する事ができませんでした。 char型の変数だと、'\0'が入っていればelseとなるのですが、 配列となっているCにstrcpyで'\0'や0,NULLを設定してみてもelseにはなりませんでした。 この様なif文でelseの処理2を実行するにはどうすれば良いのでしょうか? 初歩的な質問かも知れませんが、回答頂けると幸いです。 【定義】 typedef struct { struct { char C[100]; }B }A 【実行】 static A* hoge; hoge = (A*)malloc(sizeof(A)); if(A->B.C) { 処理1 }else{ 処理2 }

  • パールスクリプトのif else文について

    複数の種類のif else文のスクリプト結果を まとめて表示する方法はあるのでしょうか? たとえば「2000年」に対しての データ(1)のif else文のデータ内容は「1月は猫 2月は犬・・」で データ(2)のif else文は「1月は鳥 2月は申・・」であるとすると、 2000年の1月は「猫と鳥」と両方のif else文の結果を 表示させたい場合は、スクリプト的にはどのように記述すれば よろしいでしょうか? よろしくお願い致します。

    • ベストアンサー
    • CGI
  • Cプログラムの条件文  if,else if ,elseについて教えてください。

     こんにちは。課題でどうしても解らないところがあるので教えてください。  次のプログラムは一桁の数(0~9)が偶数(EVEN)か奇数(ODD)かを表示するものです。  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); else printf("%d is an ODD. \n", num); } というプログラムをコンパイルして実行すると、ちゃんと実行されるのですが、10以上の数や負数を入力しても動作してしまうんです。  そこで0~9の範囲以外の数が入力されていないかを確認して、その場合を偶数、奇数の判断や表示をせず、エラーメッセージだけを表示して終了するプログラムに書き換えなくてはならないのですが、まず  (1)判断する条件式(変数numの内容が0~9の範囲にあるか)で、num >= 0 && num <= 9 をどこに入れればいいか。  (2)please enter a number[0~9]: 8 8 is an EVEN.  (←例えば8を入れると普通こうなるのですが)   please enter a number[0~9]:12   ERROR:12 is in out of range!!  (←0~9以外ののものだったら、この様にエラー表示にしたいのです。  私が考えたプログラムは  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); if else printf("%d is an ODD. \n", num); else(num >= 0 && num <= 9) printf("ERROR:%d is in out of range!! \n",num); } という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

  • VBAでifとかelseとかelseifとかの後に書く文

    VBAでifとかelseとかelseifとかの後に書く文の出力で 現在プログラムを書きました。2行書く場合 たとえば else if 『a』を出力させるプログラム 『b』を出力させるプログラム Sheets("Sheet2").Range("A1").Value = Application.WorksheetFunction.Clean(StrConv(toDateStr(a(0)), vbWide)) Sheets("Sheet2").Range("A2").Value = Application.WorksheetFunction.Clean(StrConv(toDateStr(a(1)), vbWide)) をプログラム書いた場合、実行されるのは『a』を出力させるプログラムだけなのですが、else ifの後は次の1行目しかこのプログラムだと実行できない感じなのでelse ifの中に2行文の内容をいれたいのですが else if()で全部囲めばいいのか? else if{}で全部囲んだりするのか?このような全部ひっくるめられるプログラムはないのでしょうか? お願いします。教えてください

  • 「for next」文と「if then else」文

    両方とも「くり返し」をさせるものですけど、 for nextにできてif then elseにできないことって ありますでしょうか? 僕は無いと思うのです。 その理由は for next文は等差数列に関係したくり返しをさせるものであり if then else文は等差数列とは関係の無い繰り返しもできるし、等差数列に関係あるくり返しもできるからです。 for nextの「等差数列に関係のあるくり返し」とは 例えば for i=1 to 100 step 2 のような場合、 これは、初項1、公差2、末項100 の等差数列を用意したことを意味しますよね? つまりfor next文では「等差数列を使ったくり返し」しか出来ないのに対し、 if then else文は等差数列に関係なく、「一般的なくり返し」が出来るものだと思うのです。 つまり、for next文は存在理由が無いと思うのです。 こういう理解であっていますでしょうか? よろしくおねがいします。

  • シェルスクリプトのif文

    シェルスクリプトのif文について質問です。 あるファイルが存在しないときだけ処理を行いたい場合、 下記のような記述をするしかないのでしょうか? if [ -e /tmp/test.txt ]; then  ダミー処理(val1=1など意味のない処理)  (ダミー処理を入れるのは何も書かないとエラーとなってしまうため) else   行いたい処理 fi elseを使わずに if  fi だけですますことはできないでしょうか? -eはファイルが存在するならば真なので 逆に意味が真となるようにしたいのですが・・・

  • IF文

    (A)IF 条件 THEN 単純実行文1 ELSE 単純実行文2 (B)IF 条件 THEN 実行処理1 ELSE 実行処理2 Aの文では単純実行分なのになぜ改行すると(B)の文みたいに実行処理になるのでしょうか? 実行処理と単純実行文の違いを教えてください

  • If文の条件文の書き方

    お世話になります。 Excelでマクロを作成しております。 内容:  あるセルに、X<=300 というような条件を入れておきます。  ある値、たとえば、500 が来たときに、Xに代入して、  500<=300 という条件式を作り、それが、正しいか、正しくないか  の結果を求めたいと思っています。 このとき、if文の条件文は、値によって、変わらなくてはいけないので、 文字列の置き換え等をして、変数として条件文を作ると、「型が違います」 のエラーになります。 どのように条件文を作ればいいでしょうか?? hani = Cells(1,1).value 'セル1,1に、X<=300 が書かれています。 exp = Replace(hani, "X", 500) '"X"を500と置き換えます。 If exp Then Check = 0 Else Check = 1 End If よろしくお願いします。

  • if文の処理部分の括弧を省略した場合の書き方

    C言語のif文の書き方についてですが、通常 if(条件) { ---処理1------- } else if(条件) { ---処理2------- } else { ----処理3------ } 括弧を使った場合は上のような動作をすると思うのですが、括弧を使った場合、 次のif文の”処理1”部分if((TEST_SENSOR & 0x03) == 0x03)は正常に動作できますでしょうか? コメント文が1行入ってしまうとダメでしょうか? コンパイラはエラーは出しませんでした。 if((TEST_SENSOR & 0x03) == 0x03) //return TEST_ERR; return T_NONE; else if((SENSOR & 0x03) == 0x01) return T_LOCK; else if((TEST_SENSOR & 0x03) == 0x02) return T_UNLOCK; return T_ERR; どうぞ、ご教授頂きますよう、お願い致します。

専門家に質問してみよう