トップページ > 過去ログ > 記事閲覧
真偽値について
名前:びいかめ 日時: 2010/09/25 23:13

C/C++言語では一般に非0を真、0を偽として扱うと認識しています しかし、DxLibではソース内で value == TRUE のように1と比較している部分が見受けられます これは、DxLibではあくまで非0ではなく1が真で、0でも1でもない値は真でも偽でもない未定義な値ということなのでしょうか?

Page: 1 |

Re: 真偽値について ( No.1 )
名前:管理人 日時:2010/09/26 01:55

> これは、DxLibではあくまで非0ではなく1が真で、0でも1でもない値は真でも偽でもない未定義な値ということなのでしょうか? あまり考えたことはありませんでしたが、そのようになると思います
Re: 真偽値について ( No.2 )
名前:いっち 日時:2010/09/26 12:55

管理人さんが返答なさっているので、私が口をさしはさむことではありませんが、 DXライブラリでの TRUE と FALSE の値は WinAPI に準拠しているだけではないでしょうか。 TRUE の実値が 1 であるのは WinAPI の慣例としてそうなっているにすぎないと思います。 DXライブラリは TRUE が言語的に真となることを期待していますが、実値が何であるかを気にしてはいないと思います。
Re: 真偽値について ( No.3 )
名前:びいかめ 日時:2010/09/29 14:33

WinAPIでBOOL値を返す関数のリファレンスを見てみると、そのほとんど(私が確認した限りすべて)で真の場合非ゼロ、偽の場合ゼロを返すとなっています そのためWinAPIでは、TRUEの実値が何であるかにかかわらず、真の値でも常にTRUEであるとは限らないものと考えられます しかしDXライブラリではそのソースコード内で真の値は常にTRUEであるという前提を使っているため、WinAPIのBOOL値の仕様とは異なると考えられます
Re: 真偽値について ( No.4 )
名前:いっち 日時:2010/09/29 19:54

> WinAPIでBOOL値を返す関数のリファレンスを見てみると、そのほとんど(私が確認した限りすべて)で真の場合非ゼロ、偽の場合ゼロを返すとなっています > そのためWinAPIでは、TRUEの実値が何であるかにかかわらず、真の値でも常にTRUEであるとは限らないものと考えられます この辺はBOOL(型)に対する解釈の違いだと思います。 > ttp://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx 上記URLによるとBOOLは「A Boolean variable (should be TRUE or FALSE).」とあります。 ですので、BOOL として宣言された戻り値や変数の値は TRUE または FALSE であると期待するのが自然と (慣例に近いルールに依存したコードを書くことの良し悪しは別として)私は考えます。 確かに戻り値が BOOL の API の解説では「真の場合非ゼロ、偽の場合ゼロ」となっているようですが、 これは、「TRUE の実値が常に 1 である事を期待するようなコードを書いてはいけない」という警告であり、 戻り値に TRUE または FALSE 以外の値が返る可能性を示唆するものではないと私は考えます。 と、書いてみましたが、単なる私の思い込みかもしれません。 他の方々はびいかめさんの仰るように BOOL に TRUE または FALSE 以外の値が入ることもあるとお考えかもしれません。
Re: 真偽値について ( No.5 )
名前:びいかめ 日時:2010/09/30 09:05

上記引用にはあくまで"should be TRUE or FALSE"と書かれてあり、"must be TRUE or FALSE"とは書かれていません ここから、推奨はされないまでもTRUEまたはFALSE以外の値も仕様上許されると読みとることが出来ます よって、WinAPIにおいて真の値が常にTRUEであるとは限らないと私は考えます
Re: 真偽値について ( No.6 )
名前:いっち 日時:2010/09/30 12:33

その場合、TRUE と FALSE の仕様はどの様になるのでしょうか? 私の認識としては両者の仕様は以下の通りです。 TRUE...非ゼロ FALSE...ゼロ ただし、仕様を実装に移す場合、C言語には真偽値を完全に表す手段が無いので、 便宜上 TRUE は 1 となっているのだと思います。
Re: 真偽値について ( No.7 )
名前:びいかめ 日時:2010/09/30 13:06

MSDN上にTRUEおよびFALSEの仕様を見つけられなかったので想像するしかないですが、いっちさんの考え方であっていると思います
Re: 真偽値について ( No.8 )
名前:いっち 日時:2010/09/30 19:51

仕様上 TRUE が非ゼロを表すための定義であるならば、「真の場合非ゼロ、偽の場合ゼロ」を 「真の場合 TRUE、偽の場合 FALSE」と読み替えることは不自然ではないと思います。 ともあれ、DXライブラリにおける BOOL の扱いに対する私なりの見解としましては以下のようになります。 ・BOOL型が TRUE と FALSE 以外の値を示す可能性は考慮していない。(その上でフェイルセーフは考慮しているかもしれない) したがって、BOOL型の value 等の変数と TRUE を等不等で比較することに問題は無い。 ・TRUE の実値が何であるかは考慮していない。あくまで TRUE として扱う。 私の認識に誤りがあれば、ご指摘よろしくお願いします。
Re: 真偽値について ( No.9 )
名前:びいかめ 日時:2010/10/01 10:15

> 仕様上 TRUE が非ゼロを表すための定義であるならば、「真の場合非ゼロ、偽の場合ゼロ」を > 「真の場合 TRUE、偽の場合 FALSE」と読み替えることは不自然ではないと思います。 「TRUEの場合 真、FALSEの場合 偽」と読み替えることは出来ますが、「真の場合 TRUE、偽の場合 FALSE」と読み替えることは出来ないと思います No.5を認めてくださるなら、真の場合は1,2,3,...といろいろな値が考えられるため、常にTRUEというひとつの値はとりえないと思います > ・BOOL型が TRUE と FALSE 以外の値を示す可能性は考慮していない。(その上でフェイルセーフは考慮しているかもしれない)。 > したがって、BOOL型の value 等の変数と TRUE を等不等で比較することに問題は無い。 DXライブラリのソースコードを読む限り、TRUEでもFALSEでもない値は未定義値として扱っているようです 未定義値であれば考慮する必要もないので、DXライブラリ上はTRUE値との比較も仕様上合法だと思います > ・TRUE の実値が何であるかは考慮していない。あくまで TRUE として扱う。 DXライブラリの中にはTRUE,FALSE,-1の3論理値を返す関数があるので、少なくともTRUEが-1ではないという前提は使っていると思います それ以外にTRUE値を限定する要素は見つけられなかったので、0でも-1でもない何かの値ということになると思います ただ、No.1の管理人さんの反応を見る限り、TRUE値は1であるという前提で実装しているような気もします
Re: 真偽値について ( No.10 )
名前:管理人 日時:2010/10/04 05:37

あまり考えたことはありませんが 思い返してみると TRUE について必ず 1 であることを前提にしてはいませんでしたが、 「少なくとも 0 以下の値ではない」ということを前提に組んではいると思います

Page: 1 |