|
初歩的ですいません。 ifb ○○ and ○○ とandで2つ以上の条件を足すと思った通りの挙動をしないことがあります。 前はこれでいけた記憶があるんですが、書き方が悪いのでしょうか? ちなみにandではなくorだと追加しても大丈夫だったりしました。
下記では2つとも「発見した」の結果を得たいのですが、case1では発見、case2では見つからないが返ってきます。どう直したらいいのでしょうか?
str="山田君と一緒に焼き肉を食べに行きました。"
//case1 ifb pos("山田",str) then print "山田を発見" else print "見つからない" endif
//case2 ifb pos("山田",str) and pos("焼き肉",str) then print "山田と焼き肉を発見" else print "見つからない" endif
|
No.2345 2016/04/22(Fri) 14:11:03
|
☆ Re: ifの条件をandで増やすと動かない? / しき |
|
|
//0<pos("山田",str) のようにする str="山田君と一緒に焼き肉を食べに行きました。" ifb 0<pos("山田",str) and 0<pos("焼き肉",str) then print "山田と焼き肉を発見" else print "見つからない" endif
//and はビット演算 str="山田君と一緒に焼き肉を食べに行きました。" a = pos("山田",str) b = pos("焼き肉",str) c = (a and b) print a //1 //2進数 0001 print b //8 //2進数 1000 print c //0 //2進数 0000
pos()関数は、発見した文字位置を返します 1 と 8 のandをとると、0 になります ifb の判定は、0は偽、0以外は真 ですので、 "見つからない" となります
参考URL ビット演算 http://www.eonet.ne.jp/~nao2/c/c_bitsoperation.htm 1)ビットごとの論理積【and】(演算記号 &)
|
No.2346 2016/04/22(Fri) 15:05:43
|
|
☆ Re: ifの条件をandで増やすと動かない? / stuncloud |
|
|
ifb (pos("山田",str) > 0) and (pos("焼き肉",str) > 0) then
とするのが確実です
posが数値を返すので、それぞれの値の論理積がifで評価されます なのでたまたまTRUEになる場合もありえます(が、それが期待通りの結果になっているとは限りません) 例: str="山田君と一緒に隣駅へ焼き肉を食べに行きました。" ∵ 1 and 11 = 1
|
No.2347 2016/04/22(Fri) 15:10:38
|
|
☆ Re: ifの条件をandで増やすと動かない? / stuncloud |
|
|
しきさんとかぶってしまった… こういうのはうっかりしてるとまったく予期せぬバグの原因になったりするので気をつけましょう!
|
No.2348 2016/04/22(Fri) 15:13:51
|
|
☆ Re: ifの条件をandで増やすと動かない? / むーたん |
|
|
うおお… ビット演算なんてものがあったんですね! 今まで(たまたま)上手くいっていたこともあって、完全に盲点でした。 8ビットで1バイトくらいのことは知ってたけれどそれがこんな形で絡んでくるとは… これを機に色々勉強してみます。 しきさん、stuncloudさん、ありがとうございました!
|
No.2350 2016/04/22(Fri) 15:56:15
|
|