論理演算の挙動確認No.25622
たけとり さん 08/11/10 21:01
 
うまくいえないのですが‥‥‥(^-^;

たとえば

#a = true;
#b = false;

if( #a || !#b )
 //...

といった条件式の条件に||や&&が使われており、かつその後ろに否定文があると、
「数値を入れるべきところに数値以外が」云々のマクロエラーが出るのですが、これ
って以前からでしたっけ?
というか、再現しますでしょうか。
ちなみに、条件式の中が否定だけで&&||がないときは発生しませんし "!変数" では
なく"変数==false" や "(!変数)" と書いたらエラーは出ません。

また、
 #a = true;
 if( !#a || 1 )...
という条件式(論理演算子の前に否定があるとき)ではエラーは出ませんが、偽になっ
ているような気がするのですがこれって真じゃないでしょうか。
# 「(!#a) || 1」とくくると真になります。

秀丸7.10で発生します(OSはXP SP2、秀丸はともに浮動小数点バージョンで浮動小数
点モードではない) 。

ここまで書いてもう一度マニュアルをよく見たら、順番が違うとありますが、もしか
して
 if( !#a || 1 )...

 if( !(#a || 1) )...
などと解釈されているのでしょうか。

# dllfunc関係の関数を使っているとこの書き方が多くなるので、現状のはちょっと
不便です。

よろしくお願いします。

[ ]
RE:25622 論理演算の挙動確認No.25623
秀丸担当 さん 08/11/11 11:18
 

>といった条件式の条件に||や&&が使われており、かつその後ろに否定文があると、
>「数値を入れるべきところに数値以外が」云々のマクロエラーが出るのですが、これ
>って以前からでしたっけ?
>というか、再現しますでしょうか。

>という条件式(論理演算子の前に否定があるとき)ではエラーは出ませんが、偽になっ
>ているような気がするのですがこれって真じゃないでしょうか。

いずれも、確認することができました。
これは、V1.xxからずっとこうなっていて、!の優先順位はヘルプにもあるとおり、
C言語とは異なっていました。
これを変更するのは互換性がなくなってしまうので難しいです。申し訳ありませ
ん。
とりあえず、#a==0 というような感じにするといいのではないかと思います。

[ ]
RE:25623 論理演算の挙動確認No.25632
たけとり さん 08/11/13 16:42
 
>これを変更するのは互換性がなくなってしまうので難しいです。申し訳ありませ
>ん。

了解しました。

手元では、〜が短い場合は(!〜)という風にし、〜が長い場合は〜==0とするなどの運
用で避けてみようと思います。

また何かありましたらよろしくお願いします。

[ ]