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

このQ&Aのポイント
  • else if文の順序を変えることで、条件判定の結果が異なる場合があります。
  • (2)の部分が実行されない原因は、条件判定の順序が逆であるためです。
  • (1)と(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に順序なんかあるんでしょうか? こられのスクリプトに違いがありましたら、教えていただけませんか?」

  • sutty
  • お礼率87% (132/151)
  • Flash
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

if A ~ else if B~ else if C~.... は先頭から順番に評価しますから、とうぜん、順番に意味があります。 また、条件式には書かないことが多いですが、「直前までのifの条件が不成立で、かつ」という 条件が付いてます。 上の例なら else if B → if !A and B else if C → if !A and !B and C です。順番が変われば条件も変わってくることが解ると思います。 それをふまえてこのスクリプトを見ると A: _root.get_tabaco == false B: _root.get_tabaco == true C: _root.state_tabaco == 2 です。 ここで、A,Bに注目すると、通常、 a != false ⇔ a==true です。 つまり、 Aが成り立たなければ、必ずBが成り立ちます。 A→B→Cの順番で評価したら、 AかBかでどちらかが必ず成立つので、Cまで進むことはありません。 A→C→Bの順番で評価したら、 Bを評価する前にCを評価するので、Cの条件での判定ができます。 ついでにいうと、「○全て実行されます。」の方の最後の「else if(_root.get_tabaco ==true)」は条件が成立つことが明かなので、 else だけで十分です。

sutty
質問者

お礼

ありがとうございます。よく分かりました。 詳細な説明をしていただき非常に分かりやすかったです。 お世話になりました。

その他の回答 (3)

  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.4

もちろん大きな意味があります。 else if(~) は 「それ以外で、もし~なら」ですよね。 _root.get_tabaco は true か false で判定すれば、そのどちらかしかないわけですから、 2の場合はもちろんtrue なので、else if(A==2){ に行く前に else if(A==true) で該当してしまいます。 ■ダメな場合 if( A == false){   //falseの場合ここで処理されて終わり。 }else if(A==true){   //trueの場合ここで処理されて終わり。2もここで該当。   //※結局、どんな値でもtrueかfalseに該当するので、これ以降に進むことはない。 }else if(A==2){   //それ以外で 2 の場合、だが 2はtrueですでに上で該当済み } ■うまくいった場合 if( A == false){   //falseの場合ここで処理されて終わり。trueの場合は下へ続く }else if(A==2){   //trueでも 2 の場合のみココで処理される }else if(A==true){   //それ以外で…つまり 2 以外で trueの場合はココヘ来る。 }

sutty
質問者

お礼

丁寧な説明をしていただき、ありがとうございました。 よく分かりました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

あー、順序の話ですが(そっちが主題なのに忘れていた)、ifの判定は「書かれている順」です。 ですから、このケースでは順序を変えるだけで意図通りに動くようになった訳です。

sutty
質問者

お礼

どうもありがとうございました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

_root.get_tabacoはfalseでなければtrueに決まっているので、前者では最初の判定(==false)か次の判定(==true)のいずれかに必ずヒットしてしまいます。 ifの分岐はどれか一つに当たった時点で終わりなので、このときに最後の判定に入ることは絶対にありません。

関連するQ&A

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

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

  • ドラッグしたときの当たり判定

    ParaFlaを使ってFlashを制作しています aというスプライトをドラッグし bというスプライトにぶつかったらラベルCに飛ぶ というものを作りたいのですがうまくいきません aに記述しているアクションスクリプト on (press) { this.startDrag (true); } - on (release,releaseOutside) { this.stopDrag (); } - onClipEvent (enterFrame) { if(this.hitTest(_root.b) == true) { this.gotoAndPlay("c"); } } - onClipEvent (mouseMove) { updateAfterEvent(mouse); } バージョンはSWF8です ドラッグはできるのですがbとぶつかっても 何も起こりません bには何も記述していません どこを変更すればよいかわかる方 よろしくお願いします

    • ベストアンサー
    • Flash
  • カウントダウンタイマー

    Flashで作成したカウントダウンタイマーの設定時間をJavaScriptで変更することは可能でしょうか? 例) 11秒のカウントダウンをJavaScriptで50秒に変更等。 また、変更する場合、下記コードのどの部分を変更したら良いか ご教授頂けたら幸いです。 onClipEvent (load) { cnt = 11*1000; _root.cnt_flg = false; if (!_root.cnt_flg) { _root.cnt_flg = true; _root.my_time = getTimer(); } } onClipEvent (enterFrame) { if (_root.cnt_flg) { ms = cnt-(getTimer()-_root.my_time); m = Math.floor(ms/60/1000); s = Math.floor(ms/1000)-m*60; if (ms>=0) { this.TM.text = m; this.TS.text = s; } else { _root.gotoAndPlay("timeover"); } } }

  • カウントダウンタイマーについて

    カウントダウンタイマーで、クリックするとカウントダウンが始まる設定のコードを見つけましたが、 クリックをしないでもカウントダウンするためには、 どのコードを削ったら良いのかわかりませんでした。。 ご教授頂けたら幸いです。 onClipEvent (load) { cnt = 5*1000; _root.cnt_flg = false; } onClipEvent (enterFrame) { if (_root.cnt_flg) { ms = cnt-(getTimer()-_root.my_time); m = Math.floor(ms/60/1000); s = Math.floor(ms/1000)-m*60; if (ms>=0) { this.TM.text = "あと "+m+"分 "+s+"秒"; } else { this.TM.text = "TIMEOVER!"; } } } on (release) { if (!_root.cnt_flg) { _root.cnt_flg = true; _root.my_time = getTimer(); } }

    • ベストアンサー
    • Flash
  • ポップアップを一定時間、またはマウスが乗っている間表示させておく

    スクリプトに詳しくないので、教えていただきたいです。 画面上のあるエリアにマウスをのせるとポップアップウィンドウのようなものが表示され、 その中にあるボタンをクリックすると外部swfを読み込むという仕組みを 作りたいと思っています。 下に書いてあるスクリプトでポップアップが出てくるようにしたのですが、 その次がわからなくて困っています。 (1)マウスがエリアから外れても、一定時間(例えば1秒とか)ポップアップを 表示したままにしたい (2)ポップアップにマウスがのっている間は表示させておきたい (1)はエリア部分とポップアップが離れている場合(といってもほんの少しです)を 考えてのことです。 いい方法がありましたらぜひ教えてください。 どうぞよろしくお願いいたします。 エリア部分に書いたActionScript --------------------------------------------------------------- onClipEvent (load) { _root.popup._visible = false; } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse,_root._ymouse,1)) { _root.popup._visible = true; } else { _root.popup._visible = false; } } ---------------------------------------------------------------

    • ベストアンサー
    • Flash
  • 良いソースの書き方について(複数のインスタンスをまとめてヒットテストする方法)

    ■例文: ---------------------------------------------------------------- onClipEvent (enterFrame) { if ( this.hitTest(_root.char1)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char2)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char3)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char4)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char5)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char6)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char7)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char8)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char9)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char10)) { _parent.nextFrame(); } else if ( this.hitTest(_root.char11)) { _parent.nextFrame(); } } ---------------------------------------------------------------- 上記は、_root.char1 から_root.char11までインタンス名をつけたムービークリップとのヒット確認をするアクションスクリプトです。 こういう動作をしたい場合。 for文を駆使する等で、ソースを短くまとめる方法はありませんでしょうか。 いい案がありましたら、是非ご教授の程宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 同じ動作のmcが増えると同じ動作をしなくなる

    こんにちは。いつも、ありがとうございます。MAC_OS10、Flash8です。 以下のようなmcを作って水泳のアニメーションをしています。 ひとりだと問題なく動作するのですが、4人泳がせると何人かはターンしないまま、後ろ向きで泳いでしまいます。回避できる方法はないでしょうか?ここから前に進まなくて、困っています。 onClipEvent (enterFrame) { if (_x >= 675) { this.gotoAndPlay ("turn"); _x = 675; vectx = -vectx; } _x += vectx; if (_x <= 48) { if (turn_tim == 0) { this.gotoAndPlay ("turn2"); _x = 48; vectx = _parent.spd[2]; _x += vectx; } else { this.gotoAndPlay ("gool"); _x = 48; } } } onClipEvent (load) { vectx = _parent.spd[2]; turn_tim = 0; }

  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

  • 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 }

  • flash as2.0 hitTest()について

    FLASHMXで作業をしています。 mcが壁に当たると反対方向にmcを移動させたいのですが 以下では、うまくいきません。理由がわかりませんし打開策も わかりません。解決策を教えてください。よろしくお願いいたします。 onClipEvent(load){ this._x=100; this._y=380; } onClipEvent(enterFrame){ this._y -=3; if(_root.tama_mc.hitTest(_root.kabe_mc)==true){ this._y +=5; } }

専門家に質問してみよう