プロが教えるわが家の防犯対策術!

どう直せばいいのでしょうか?
//statusは整数
if (((status and 3) > 0) or ((CBox.Checked = false)and(status and 12) > 0)) then begin
...
...
end;
//****************************
コンパイルすると以下のエラーが出ます。
[dcc32 エラー] : E2015 この型には指定した演算子は使えません
[dcc32 警告] : W1023 符号付きの型と符合なしの型を比較しています (両オペランドを拡張しました)

A 回答 (3件)

Delphi自体は使っていませんが。




コンピュータになったつもりで、式を確認してみましょう
一番内側の括弧から、別の文字に書き換えていきます

※ A := (status and 3) とする(整数)
※ B := (CBox.Checked = false) とする(Boolean)
※ C := (status and 12) とする(整数)
((A > 0) or (B and C > 0))

※ D:= (A>0) とする(Boolean)
※ E:= (B and C > 0) とする (?)
(D or E)


この条件式は、上記のように解釈されて真偽を求めます。


おそらく、問題は (B and C > 0) 、つまり((CBox.Checked = false)and(status and 12) > 0)の部分です。

B and C > 0
は、2通りの解釈ができます。

(B and C) > 0
※ and の方が > より優先順序が高い、または、同じ優先順位え左から解釈することになっている

B and (C > 0)
※ > の方が and より優先順序が高い

優先順位は、例えば、足し算と掛け算が同列に並んでいたら、掛け算を先にする、とか言ったのと同じものです。

Delphiのマニュアルで、演算子の優先順位を調べてくだあい。
and の方が > より優先順序が高いのでは?

それだと、 (B and C) > 0 と解釈されています。
Booleanと整数 の and を計算しようとします。


このような優先順位や、Booleanと整数の演算、といったことは、言語によって異なります。
マニュアルを確認しましょう。
あやしいときは、括弧で明示的に順位を付けることです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
if (((status and 3) > 0) or ((CBox.Checked = false)and((status and 12) > 0))) then begin
とすることでコンパイルできるようになりました。
(status and 12) > 0)) -->((status and 12) > 0)))
演算子の優先順位はわかっていたつもりだったんですけど、意図したとおりにかけていませんでした。
わかりやすい説明ありがとうございました。

お礼日時:2016/09/15 08:20

演算子の優先順位を確認しましょう。

and は Delphi では優先順位が高いんです。

http://docwiki.embarcadero.com/RADStudio/Berlin/ …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
if (((status and 3) > 0) or ((CBox.Checked = false)and((status and 12) > 0))) then begin
とすることでコンパイルできるようになりました。
(status and 12) > 0)) -->((status and 12) > 0)))
演算子の優先順位はわかっていたつもりだったんですけど、意図したとおりにかけていませんでした。

お礼日時:2016/09/15 08:19

手元にコンパイラ環境が無いので確認していませんが、これでいけませんか?



if (((status and 3) <> null) or ((CBox.Checked = false)and(status and 12) <> null)) then begin
...
...
end;
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
if (((status and 3) > 0) or ((CBox.Checked = false)and((status and 12) > 0))) then begin
とすることでコンパイルできるようになりました。
(status and 12) > 0)) -->((status and 12) > 0)))

お礼日時:2016/09/15 08:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A