アプリ版:「スタンプのみでお礼する」機能のリリースについて

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に順序なんかあるんでしょうか?
こられのスクリプトに違いがありましたら、教えていただけませんか?」

A 回答 (4件)

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 だけで十分です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/24 20:14

もちろん大きな意味があります。


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の場合はココヘ来る。
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/24 20:18

あー、順序の話ですが(そっちが主題なのに忘れていた)、ifの判定は「書かれている順」です。


ですから、このケースでは順序を変えるだけで意図通りに動くようになった訳です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/24 20:15

_root.get_tabacoはfalseでなければtrueに決まっているので、前者では最初の判定(==false)か次の判定(==true)のいずれかに必ずヒットしてしまいます。


ifの分岐はどれか一つに当たった時点で終わりなので、このときに最後の判定に入ることは絶対にありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!