if ...&&...でtrueが返らない(質問掲示板)
投稿: fragile
投稿:2012/06/30 23:32:30(最新:2012/07/01 15:40:01)
あるスクリプトの一文に
とあり,出力は
でした。
エラーは表示されませんでした。
最初の2行が出力されたのに3行目が出力されないのは何故でしょうか?
ツイート
if ml then speak("ml,",ml) ; end if dir(gv("mir")[ml])[1] then speak("gv",dir(gv("mir")[ml])[1]) ; end if ml && dir(gv("mir")[ml])[1] then speak("&&");else speak("!&&");end
とあり,出力は
ml,0 gvtrue !&&
でした。
エラーは表示されませんでした。
最初の2行が出力されたのに3行目が出力されないのは何故でしょうか?
コメントする
コメントするには、ログインする必要があります。
コメント一覧
if の時に加え,whileも調べてみましたが
と,0はfalse扱いでした。
また,
は判定上0 = = 0なので実行されました。
もしかしてifの意味をもう少し考えた方がいいかも。
例えば今は if a だとaがあるか?みたいな意味合いだけど
if a = = ???みたいに何かが省略された書き方と捉えるとか。
まあ???が分かったところで解決はしないけど...
while 0 do speak("0") ; end #実行されなかった a=0 ; while a do speak("a") ; end #実行されなかった while -1 do speak("-1") ; end #ひたすら-1が表示された while 1 do speak("1") ; end #ひたすら1が表示された
また,
case 0 when 0 speak("0") end
もしかしてifの意味をもう少し考えた方がいいかも。
例えば今は if a だとaがあるか?みたいな意味合いだけど
if a = = ???みたいに何かが省略された書き方と捉えるとか。
まあ???が分かったところで解決はしないけど...
一応否定演算等々含めて検証してみました
やたらと長いですが...
画面テキスト
aも0もtrueなのに&&で判定するとfalseになったのですが
HP等に使用することを考えた仕様でしょうか?
(でも if HP だと0でもtrueだし...)
やたらと長いですが...
#テスト a = 0 ; b = createArray() if 0 then b[0]=true ; else b[0]=false ; end if a then b[1]=true ; else b[1]=false ; end if 0 || a then b[2]=true ; else b[2]=false ; end if a || 0 then b[3]=true ; else b[3]=false ; end if 0 && a then b[4]=true ; else b[4]=false ; end if a && 0 then b[5]=true ; else b[5]=false ; end if !0 then b[6]=true ; else b[6]=false ; end if !a then b[7]=true ; else b[7]=false ; end if (!0) || a then b[8]=true ; else b[8]=false ; end if 0 || (!a) then b[9]=true ; else b[9]=false ; end if (!0) || (!a) then b[10]=true ; else b[10]=false ; end if (!a) || 0 then b[11]=true ; else b[11]=false ; end if a || (!0) then b[12]=true ; else b[12]=false ; end if (!a) || (!0) then b[13]=true ; else b[13]=false ; end if (!0) && a then b[14]=true ; else b[14]=false ; end if 0 && (!a) then b[15]=true ; else b[15]=false ; end if (!0) && (!a) then b[16]=true ; else b[16]=false ; end if (!a) && 0 then b[17]=true ; else b[17]=false ; end if a && (!0) then b[18]=true ; else b[18]=false ; end if (!a) && (!0) then b[19]=true ; else b[19]=false ; end #画面に収まらないので setTextFontSize(getTextFontSize()/2) setTextViewMode(1-getTextViewMode()) #テスト結果を表示 speakFullScreen(true, " a = 0" , "\n if 0 = ",b[0] , "\n if a = ",b[1] , "\n if 0||a = ",b[2] , "\n if a||0 = ",b[3] , "\n if 0 && a = ",b[4] , "\n if a && 0 = ",b[5] , "\n if !0 = ",b[6] , "\n if !a = ",b[7] , "\n if !0||a = ",b[8] , "\n if 0||!a = ",b[9] , "\n if !0||!a = ",b[10] , "\n if !a||0 = ",b[11] , "\n if a||!0 = ",b[12] , "\n if !a||!0 = ",b[13] , "\n if !0&&a = ",b[14] , "\n if 0&&!a = ",b[15] , "\n if !0&&!a = ",b[16] , "\n if !a&&0 = ",b[17] , "\n if a&&!0 = ",b[18] , "\n if !a&&!0 = ",b[19])
画面テキスト
a = 0 if 0 = true if a = true if 0||a = true if a||0 = true if 0 && a = false if a && 0 = false if !0 = false if !a = false if !0||a = true if 0||!a = false if !0||!a = false if !a||0 = true if a||!0 = false if !a||!0 = false if !0&&a = false if 0&&!a = false if !0&&!a = false if !a&&0 = false if a&&!0 = false if !a&&!0 = false
aも0もtrueなのに&&で判定するとfalseになったのですが
HP等に使用することを考えた仕様でしょうか?
(でも if HP だと0でもtrueだし...)
そもそも数値を条件式に含めるのは
イレギュラー的な扱いだと思っていたので
詳しく検証したことはありませんでしたが
変数に入れているかどうかでも
動作が変わってくるのですね
その理由は分かりませんけれど
イレギュラー的な扱いだと思っていたので
詳しく検証したことはありませんでしたが
変数に入れているかどうかでも
動作が変わってくるのですね
その理由は分かりませんけれど
実装側のミスです。
仕様としては0は真として扱わなければいけませんが、
&&や||やwhileの場合に0を偽として扱ってしまっています。
ifと!は0を真として扱っています。
おそらくこれを修正してしまうと
ほかのゲームなどが影響を受けてしまうと思われるため
修正はおこなわない方向で考えています。
よろしくお願いします。
ありがとうございます