if ...&&...でtrueが返らない(質問掲示板

投稿: 128 mini fragile 投稿:2012/06/30 23:32:30(最新:2012/07/01 15:40:01)
あるスクリプトの一文に
 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行目が出力されないのは何故でしょうか?

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Zararu128x128 mini dycoon(投稿日:2012/07/01 15:32, 履歴)
大変申し訳ありません、これはスクリプト言語の
実装側のミスです。

仕様としては0は真として扱わなければいけませんが、
&&や||やwhileの場合に0を偽として扱ってしまっています。
ifと!は0を真として扱っています。
おそらくこれを修正してしまうと
ほかのゲームなどが影響を受けてしまうと思われるため
修正はおこなわない方向で考えています。

よろしくお願いします。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 15:40, 履歴)
ご丁寧な詳細の解説
ありがとうございます
128 mini fragile(投稿日:2012/07/01 12:06, 履歴)
if の時に加え,whileも調べてみましたが
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が表示された
と,0はfalse扱いでした。

また,
case 0
when 0
speak("0")
end
は判定上0 = = 0なので実行されました。


もしかしてifの意味をもう少し考えた方がいいかも。
例えば今は if a だとaがあるか?みたいな意味合いだけど
if a = = ???みたいに何かが省略された書き方と捉えるとか。

まあ???が分かったところで解決はしないけど...
128 mini fragile(投稿日:2012/07/01 11:37, 履歴)
とりあえず&&がダメなら
if a then if 0 then speak("true");end;end
みたいに入れ子ににするのも手といえば手かも。

ちなみに上のはtrueが表示されました。
128 mini fragile(投稿日:2012/07/01 10:31, 履歴)
一応否定演算等々含めて検証してみました
やたらと長いですが...
#テスト
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だし...)
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 10:47, 履歴)
そもそも数値を条件式に含めるのは
イレギュラー的な扱いだと思っていたので
詳しく検証したことはありませんでしたが

変数に入れているかどうかでも
動作が変わってくるのですね

その理由は分かりませんけれど
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 10:50, 履歴)
あ、条件式の開始文字列が
ブーリアンか数値なのかで
処理が変わっているのかも

← ブーリアンでの処理

0 or a ← 数値での処理

後は、
数値の場合nullならfalse
それ以外でtrueという
先ほどの公式が当てはまるとすれば
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 10:51, 履歴)
ちょっと修正

「!」 ← ブーリアンでの処理
「0」or「a」 ← 数値での処理
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 10:53, 履歴)
数値&&数値の解決になってなかった(w
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/06/30 23:57, 履歴)
ml = 0 ≒ false で
fale && true = false ですから
"!&&"の出力で正常かと
128 mini fragile(投稿日:2012/07/01 01:31, 履歴)
もし0がfalseだと一行目は表示されないのでは?
という疑問になってしまい、悶えてます

スマホからなので今はできませんが、
単項の時や||,&&の時の0の扱いについて調べてみます。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 10:40, 履歴)
数値や文字列を直接条件式とした場合は
nullの場合のみfalse判定となります