HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0817
ほえほえif文での条件式7解決


ほえほえ

リンク

2017/8/17(Thu) 08:25:42|NO.80977

以下のソースですが、

a = 5 b = 1|2|5 if a = b { dialog "一致" } else { dialog "不一致" }
実行すると a には5、b には論理演算で7が代入されるので、不一致と表示されますが、
これを書き換え、

a = 5 if a = 1|2|5 { dialog "一致" } else { dialog "不一致" }
こうすると、一致と表示されてしまうのです。
これは、なぜなのでしょうか?



この記事に返信する


通りすがりの初心者

リンク

2017/8/17(Thu) 11:19:01|NO.80978

hspではif文の条件式で & や |を使ってAND ORを指定できるため、
if a = 1|2|5 と書くと if a = 1|a = 2|a = 5
と認識されます。するとaが 1 or 2 or 5 のときtrueとなるif文として認識されるのでa = 5で一致となります。

回避方法
	a = 5
if a = (1|2|5) { dialog "一致" } else { dialog "不一致" }



沢渡

リンク

2017/8/17(Thu) 11:54:17|NO.80981

>通りすがりの初心者さん
回避方法はそれで正しいのですが、
>if a = 1|2|5 と書くと if a = 1|a = 2|a = 5
>と認識されます。するとaが 1 or 2 or 5 のときtrueとなるif文として認識されるのでa = 5で一致となります。
これは違います。
今回の失敗例が想定通りに認識されないのは、比較演算子(=)の方が論理演算子(|)よりも優先順位が高いからです。
失敗例の場合、aがどんな値をとっていようが「一致」になります。



HIJIKIsw

リンク

2017/8/17(Thu) 12:45:09|NO.80982

>沢渡 様
>今回の失敗例が想定通りに認識されないのは、比較演算子(=)の方が論理演算子(|)よりも優先順位が高いからです。

これはどういう意味ですか?

私の認識では、HSP の if は条件式に「1以上の整数」を渡せばtrueとして扱われる仕様があり、


if 0 { mes "one" } if 1 { mes "two" } if 2|5 { mes "three" }

今回のスレ主さんの書き方では、下記の 3 つの or 条件を渡していることになっていて
その内に「1 以上の整数」が含まれるから a の値に関わらずtrue になっている。
と認識しています。

a = 1 2 5

true という概念が存在する言語 (C / Java 等) に置き換えて書くとすれば


if( a == 1 || true || true ) { }

というような式になっているんだと推測しています。
これは誤りでしょうか?後学のために教えてくだされば幸いです。



沢渡

リンク

2017/8/17(Thu) 13:11:15|NO.80983

>HIJIKIswさん
はい、そういうことで合っています。
私が言いたかったのは「真っ先にa=1が計算され、その後、『a=1の結果』・2・5のorが計算される」
ということで、HIJIKIswさんの仰ることと同じです。

ただ一つ、
>HSP の if は条件式に「1以上の整数」を渡せばtrueとして扱われる
正確には、0だけがfalseとして扱われ、0以外はすべてtrueとして扱われます(負の値でもtrue)。



HIJIKIsw

リンク

2017/8/17(Thu) 13:24:33|NO.80984

>沢渡 様
ありがとうございます。理解できました。

>正確には、0だけがfalseとして扱われ、0以外はすべてtrueとして扱われます(負の値でもtrue)。
これは知らなかったです。勉強になりました!

整数の場合 0以下 1以上 で分かれていると思っていました。



ほえほえ

リンク

2017/8/18(Fri) 08:58:36|NO.80995

皆様ありがとうございます。
なるほど、イコールがまず演算され、その後orが順次演算されるのでこういうことになるのですね……
勉強になりました。



ほえほえ

リンク

2017/8/18(Fri) 08:59:00|NO.80996

解決済みにいたします。



ONION software Copyright 1997-2023(c) All rights reserved.