• ベストアンサー

if文が入れ子の場合の条件の解釈

以下のようにif文が入れ子の場合についての質問です。 if(条件1){ if(条件2){ 実行内容1 } }else{ 実行内容2 } このような場合、条件1がTrueでも条件2がFalseであれば、実行内容2が実行されるのでしょうか?それともこのような場合、両方の実行内容(実行内容1及び2)が実行されないのでしょうか? もしも、上記で実行内容2が実行されない場合: やはり、条件1がTrueで、かつ、条件2=Trueの場合以外は全て実行内容2が実行されるようにするには、下記のように「and」で条件を繋ぐしかないのでしょうか? if(条件1 and 条件2){ 実行内容1 }else{ 実行内容2 } 「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 何か良い方法をお知りでしたら、お教え下さい。記述方法が記載されているサイトのURL等でも結構です。 よろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数3

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

  • ベストアンサー
  • nicolish
  • ベストアンサー率72% (13/18)
回答No.6

>if(条件1 and 条件2){ > 実行内容1 >}else{ > 実行内容2 >} >「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 andよりも&&の方が個人的に見やすいと思う。まあそこは好みとして。 if ( (($year % 400) === 0 || ($year % 4 === 0 && $year % 100 !== 0) ) && $month >= 7 && $month <= 9) 死にたくなるほど分かりにくい。 案1:説明用変数の導入 $is_uruu_year = ($year % 400) === 0 || ($year % 4 === 0 && $year % 100 !== 0); $is_summer = $month >= 7 && $month <= 9; すると最初の条件判定はこう書ける。 if($is_uruu_year and $is_summer) 案2:メソッドの抽出 function isUruuYear($num){  return ($num % 400) === 0 || ($num % 4 === 0 && $num % 100 !== 0); } function isSummer($num){  return $num >= 7 && $num <= 9; } こう書ける。 if(isUruuYear($year) && isSummer($month)){ さらに、「うるう年かつ夏」という期間が、例えばあなたの店で「超ハイパー割引期間」という意味ならば、それを意味する関数も追加するといい。 function isSuperHyperDsicountPeriod($year, $month){  return isUruuYear($year) && isSummer($num); } するとANDすら不要になり、単にこう書ける事になる。 if(isSuperHyperDiscountPeriod($year, $month)) ともに、Fowler著『リファクタリング』に詳しい。 「うるう年かどうか」と、「年が400の倍数あるいは4の倍数かつ100の倍数でないか」を判定するのとでは、論理のレベルが違う。 うるう年かどうかを気にしている部分では、isUruuYear()のような関数だけを実行し、うるう年かどうかの判定処理はその関数の中に切り出すようにするといい。

kitty1000
質問者

お礼

nicolishさん ご回答、ありがとうございました。 詳しいご説明ありがとうございました。nicolishさんは、人に説明するのが上手ですね。

その他の回答 (5)

  • 7tv3mm
  • ベストアンサー率75% (12/16)
回答No.5

質問(入れ子)から逸れてしまうので参考にならないかもしれませんが、 最初に基本の実行内容を記述したPHPファイルを指定し、条件に合致した 場合に、別のPHPファイルに変更するとかは? $incl = '実行内容2.php'; if(条件1 && 条件2) $incl = '実行内容1.php'; require_once($incl);

kitty1000
質問者

お礼

7tv3mmさん ご回答、ありがとうございました。 参考にさせて頂きます。

回答No.4

んと、だから・・・ if (1 + 2 + 3 + 4 + 5 + 6 + 7 == 28 and 1 * 2 * 3 * 4 * 5 == 120){ } って書くのが長いから function a(){ return 1 + 2 + 3 + 4 + 5 + 6 + 7 == 28 } function b(){ return 1 * 2 * 3 * 4 * 5 == 120 } ってのを定義すれば if (a() and b()){ } ってなってこっちはすっきりするでしょ? 関数にしないで c = (1 + 2 + 3 + 4 + 5 + 6 + 7 == 28) d = (1 * 2 * 3 * 4 * 5 == 120) if (c and d)でも十分かもしれない ===================== >実行内容3と2を同じにすることで そうだね。でも同じことを二回書くと一つ修正したくなったときに二箇所両方直さなきゃいけない。 function ishogetrue(){ if(条件1){  if(条件2){   retrurn true;  }else{ return false; } }else{ return false; } } とかやって if (ishogetrue()){ 実行内容1 }else{ 実行内容2 } とかやった方がきれいにはまとまりそうかなあ

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 了解しました。参考にさせて頂きます。

回答No.3

悩みを完全に勘違いした >下記のように「and」で条件を繋ぐしかないのでしょうか? 多分ね。でも,その部分を関数に分けてしまえば見やすくなるんじゃないの?

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 >でも,その部分を関数に分けてしまえば見やすくなるんじゃないの? やり方をもう少し教えて下さい。サイトのURL等でも結構です。 ちなみに、先ほどお教え頂いた下記のコードは問題なく実行可能なんですよね?この場合、実行内容3と2を同じにすることで目的の結果が得られるように思いますが。 if(条件1){  if(条件2){   実行内容1  }else{ 実行内容3 } }else{  実行内容2 } 条件1 条件2 true  true  実行内容1 true  false  実行内容3 false      実行内容2

回答No.2

if(条件1){  if(条件2){   実行内容1  }else{ 実行内容3 } }else{  実行内容2 } 条件1 条件2 true  true  実行内容1 true  false  実行内容3 false      実行内容2

kitty1000
質問者

補足

himajin100000さん ご回答、ありがとうございました。 参考にさせていただきます。

noname#77845
noname#77845
回答No.1

if(条件1){  if(条件2){   実行内容1  } }else{  実行内容2 } になるので、 条件1 条件2 true  true  実行内容1 true  false  実行無し false      実行内容2 になります。 また、 if(条件1 and 条件2){ については、その通り。

kitty1000
質問者

補足

edomin2004さん ご回答、ありがとうございました。 やはり、条件1がTrueで、かつ、条件2=Trueの場合以外は全て実行内容2が実行されるようにするには、下記のように「and」で条件を繋ぐしかないのでしょうか? if(条件1 and 条件2){ 実行内容1 }else{ 実行内容2 } 「and」で条件を繋ぐ場合、各条件が長いとコードが見にくくて大変不便です。 何か良い方法をお知りでしたら、お教え下さい。記述方法が記載されているサイトのURL等でも結構です。

関連するQ&A

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

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

  • else if文の順序を変えることに意味がありますか?

    else if文の順序を変えることに意味がありますか? 「スプライトに記述したクリップアクションです。 実行される内容はどうでも良いのですが、 else if文の順序を変えることに意味がありますか?」 ×(2)の部分だけが実行されません。       onClipEvent (enterFrame) {        if (_root.get_tabaco == false ){          this.gotoAndPlay(4); (1)  }else if(_root.get_tabaco ==true){          this.gotoAndPlay(1); (2)  }else if(_root.state_tabaco == 2){          this.gotoAndPlay(5);     } } ○全て実行されます。       onClipEvent (enterFrame) {        if (_root.get_tabaco == false ){          this.gotoAndPlay(4); (2)  }else if(_root.state_tabaco == 2){          this.gotoAndPlay(5); (1)  }else if(_root.get_tabaco ==true){          this.gotoAndPlay(1);     } } 「(1)と(2)の順序を変えただけで正しく実行されるようになりました。 しかし、なぜ?上手くいったのか、どこが間違いなのか分かりません。 else ifに順序なんかあるんでしょうか? こられのスクリプトに違いがありましたら、教えていただけませんか?」

    • ベストアンサー
    • Flash
  • PHP「FALSE」や「0」を使った条件文

    「if条件文」の()に「FALSE」や値「0」がはいると なにも考える事無く無条件に 「else」以降の条件が実行になるという決まりなのでしょうか? もしそうであれば条件分にする意味があるのでしょうか? 基本的な質問で申し訳ないのですが 実際に使われる分かりやすい簡単な例があれば ご紹介ください。 よろしくお願いいたします。 例1: if(FALSE){ echo "FALSEではない"; }else{ echo "FALSEです。"; } 例2: if(0){ echo "ゼロではない"; }else{ echo "ゼロです。"; } 例3:(特にこの例は何かおかしいような気がします) if(10-10){ echo "イフが実行"; }else{ echo "エルスが実行"; }

    • ベストアンサー
    • PHP
  • ifの条件式 !について

    以下処理があります。 1.宣言、初期化 var A = new Array(); A[1] = A[2] = A[3] = false; 2.条件判断 if(!A[1] && !A[2] && !A[3]){ A[1] = $A[2] = A[3] = true; }else{ 処理 } } 質問:宣言⇒ifに処理が流れた時、条件式の内容は ・A[1]の否定⇒A1は、falseが格納されているので、否定でtrue。 ・A[2]の否定⇒A1は、falseが格納されているので、否定でtrue。 ・A[3]の否定⇒A1は、falseが格納されているので、否定でtrue。 よって、 if(true && true && true){ A[1] = $A[2] = A[3] = true; } で結果、配列の1~3は、全てfalseから、trueに変更されるという考えで間違っていないでしょうか? よろしくお願いします。

  • if文の中で否定演算子を使うことについて

    PHPの勉強をしています。 今、基礎的な内容の本とより実践的な内容の本、コードサンプルが満載の本の 計3冊で勉強しておるのですが、 たまたまなのかわかりませんが、この三冊の中ででてくるコードを見てみると、 if文の中に否定演算子、例えば IF(!A || !B) {   A、もしくはBがfalse だったのが反転してTrueになった場合の処理 }else {   A、Bどちらともtrueだったのが反転してfalseになった場合の処理 } といった条件文に否定演算子を含めたコードサンプルがほとんどです。 。。。。三冊ともこの調子なので もしかしてPHPのコーティング作法なのかな?と思いましたが ネットで検索してもそれらしい情報は見当たらず...... 自分が何がわからないのか それ自体よくわかってないのかもしれませんが IF文を使う際、条件に否定演算子を使うべきときってのがあるんだと思います。 となると、その時を判断する基準などがあるのでしょうか? 初心者なのでなにか重大な思い違いをしてるのではないかと思ってます。 なにか気づくことがあれば教えてください。

    • ベストアンサー
    • PHP
  • End Ifは不要な場合もある?

    Excel2010使用で下記のVBAのコードを書きました。 Sub イフとエンドイフは組ではなかったのか()  Dim Flag As Boolean  Dim S As Worksheet   For Each S In Worksheets    If S.Name = "合計" Then Flag = True '   Else '    Flag = False '   End If   Next S   If Flag = True Then    MsgBox "「合計」というシートはすでに存在します"   Else    Worksheets(1).Copy after:=Worksheets(Worksheets.Count)    ActiveSheet.Name = "合計"   End If End Sub 前半の >' Else >' Flag = False >' End If の部分があると「Elseに対応するIfがありません」というエラーが出ます。 Elseに関する記述だけをコメントアウトすると「End Ifに対応するIfブロックがありません」というエラーが出ます。 この部分をコメントアウトすればきちんと動作するのですが、If文はちゃんと存在しているにもかかわらず、またほとんど同じ記述の後半ではエラーが出ないというのに、なぜこのようなエラーが出るのかわかりません。 なにか勘違いをしているのでしょうか。

  • 【ExcelVBA】IF条件を満たしているのに、IF条件のところで止まってしまう

    Sub test1() 変数1 = IsEmpty(Range("C1")) If Range("A1") > 0 And Range("B1") = 0 And 変数1 = True Then   test2 End If End Sub 止まったときのデバッグでの表示は Range("A1")は「100」(セルの中身) Range("B1")は「0」(セルの中身) 変数1はRange("C1")がエラー表示なので「True」 すべての条件を満たしているのですが、 IF条件のところで止まってしまいます。 (IF条件のところの1行が黄色くハイライトになっている状態) 止まったデバッグの後に、F5を押して実行させると、 IF条件の続きから実行されて、test2が実行されて処理が終了します。 何で、IF文のところで一度止まってしまうのかわかりません。

  • 条件に寄って、ifの中身が変わる時の書き方。

    条件に寄って、ifの中身が変わる時の書き方。 条件として3つのチェックボックスがあります。 □ 10<A □ 5>B □ 1<C チェックが入っている条件に合ったデータのみを抽出します。 例えば、 ■ 10<A □ 5>B □ 1<C で有れば、Aの値が10以上の条件に合ったものを抽出 ■ 10<A ■ 5>B ■ 1<C であれば、「Aが10以上」かつ「Bが5以下」かつ「Cが1以上」の条件にあったデータを抽出する。 というのを作りたいのですが… チェックボックスの付け方として、8パターンありますが、どうしても複雑になってしまいます。もっとシンプルに書けないのでしょうか?アドバイスお願いします。 for ($n=1; $n<=100; $n++){ if ($_POST[A]==true){ if($_POST[B]==true){ if($_POST[C]==true){ if(${data.$n}[A]>10 and ${data.$n}[B]<5 and ${data.$n}[C]>1){ print_r(${data.$n}); }//すべてにチェックが入っている場合 } else { if(${data.$n}[A]>10 and ${data.$n}[B]<5){ print_r(${data.$n}); }//AとBにチェックが入っている } } else { if($_POST[C]==true){ if(${data.$n}[A]>10 and ${data.$n}[C]>1){ print_r(${data.$n}); }//AとCにチェックが入ってる } else { if(${data.$n}[A]>10){ print_r(${data.$n}); }//Aにチェックが入っている } } } else { if($_POST[B]==true){ if($_POST[C]==true){ if(${data.$n}[B]<5 and ${data.$n}[C]>1){ print_r(${data.$n}); }//BとCにチェックが入っている } else { if(${data.$n}[B]<5){ print_r(${data.$n}); }//Bにチェックが入っている } } else { if($_POST[C]==true){ if(${data.$n}[C]>10){ print_r(${data.$n}); }//Cにチェックが入っている } else { print_r(${data.$n});//チェックなし } } } }

    • ベストアンサー
    • PHP
  • if文の挙動が変です。何が悪いのでしょうか?

    こんにちは,よろしくお願いします。次のような関数を作って,条件に当てはまれば,formElemを送信するコードを書いたところ,条件を満たしていないのにもかかわらず,送信されてしまいます。それはどこが悪いのでしょうか。教えてください。 もう少し詳しく言うと,この関数は,p1とg1が変更されたとき(onchngeで)に呼び出されるようになっています。 このとき,p1が先に変更され(条件1)を満たしtrueになり,その後で,g1が変更され(条件2)がtrueになったときは,正常に機能します。alert("yes-submit");も表示され,formの送信も実行されます。 しかし,この逆で,g1が先に変更され(条件2)を満たしtrueになった時に,formが送信されてしまうのです。(条件1)が満たされていないのにもかかわらずです。気づかないうちに,条件を満たしていることもあるのかと思って,alert("yes-submit");を追加しました。しかし,そのalert("yes-submit");は表示されません。つまり,最後のif文がyesの時に実行されるブロックを通過していないのにもかかわらず,formの送信のみが行われてしまうのです。(true)&&(false)でyesにはなりませんよね。これって,変ですよね。いったいなぜ,このような挙動を示すのでしょうか?お願いします。教えてください。 function SchlSlct(){ var formElem = document.getElementById("form1"); if(document.getElementById("p1").selectedIndex > 0){ alert("p-yes"); }else{ alert("p-no"); } //以上(条件1) if(document.getElementById("g1").value != ""){ alert("g-yes"); }else{ alert("g-no"); } //以上(条件2) if((document.getElementById("p1").selectedIndex > 0) && (document.getElementById("g1").value != "")){ alert("yes-submit"); formElem.submit(); } //以上((条件1)&&(条件2)) }

  • VB For-Next文でのExitではなく中断は可能?

    初歩的な質問で申し訳ありません・・・ ループで処理しているものがあるのですが、ExitForでループを抜けることはできますが、途中で処理を中断して次のカウンタの処理へ移ることはできるのでしょうか? 例えば For i = 1 to 10   if 関数1() = False then     ■ループ処理を終了するのではなく次のカウンタ[i]に移りたい■   else     Call 関数2()   end if Next i という事をしたいと思っています。 今は For i = 1 to 10   ret = 関数1()   if ret = True then     Call 関数2()   end if Next i という方法で記述していますが、上記のような条件文が10や20もあると、IF文の入れ子入れ子でかなりコードが見にくいです・・・。 どなたかよろしくお願いします!

専門家に質問してみよう