BUTTON() AND 1 THEN ~
BUTTON() AND 2 THEN ~
↑それぞれ独立しており、ボタンの種類に合った仕事する。
BUTTON()&&1 THEN ~
BUTTON()&&2 THEM ~
↑独立せず、押したボタンの種類に関わらず同時に仕事する。
ヘルプでは似たような表記だったのに何故このようなことが起きるのでしょうか?
and はビットごと(1 とか 2 とか 4 とか 8 とか 16 とか 32 とか 64 とか...)の論理積をとります。
1 and 1 == 1 なので、 if 1 and 1 then は then 節が実行される。
1 and 2 == 0 なので if 1 and 2 then は then 節は実行されない。
if p && q then は if p then if q then と同じ。
1 && 1 の場合 if 1 then if 1 then .. と同じなので ... が実行される。
1 && 2 の場合 if 1 then if 2 then .. と同じなので ... が実行される。
ANDはビット演算子。&&は論理演算子です。
根本的な部分(0か1しかない場合)ではほぼ同じように動作しますが、それ以外では動作が変わってきます。
では、なぜマニュアルにおいて似たような扱いになっているかというと比較演算子(「==」や「>」や「<」等)を記述した場合は0と1として扱われるため「同じような動作」に相当するためです。
IF BUTTON() AND 1 THEN~ には比較演算子が含まれていません。したがって、ANDと&&は異なる動作になるわけです。
変数BにBUTTON()関数の値が入っている場合、IF B AND 16 THEN ~でAボタンが押されたかどうかの判定を記述している人は多いですがANDを「かつ」に読み直した場合はこのIF文は「B かつ 16」になり、「0か1か」という「ANDを『かつ』として扱えるための条件」を満たしていません。
Bの値と16という値をビット演算を行い0か0以外かでTHEN以下を実行するかどうかが決まります。
では、このIF文に比較演算子を付けるとしたらどうなるかというとIF (B AND 16)==16 THEN ~となります。
ビット演算子は演算優先順位が低いためカッコが必要となります。
このように記述していけば「かつ」の部分はANDでも&&でもほぼ同じように動作します。
> 条件式ではその結果が1(又はそれ以上)か0かで判定している
0 か 非0 か、です。
一番重要な違いは、
if p && q then では p が 0 なら q は評価されないってこと。
こういう仕様でなかったら && の存在意義はないに等しい。
def p(b): ? "p": return b: end
def q(b): ? "q": return b: end
if p(1) && q(1) then end ' p と q と表示
if p(0) && q(1) then end ' p のみ表示
もともと C には & はあれど && は無かったし、仕様上必要ってものでもなかった。
でも ken と dmr は、こういう仕様の論理式をあえて導入したってわけ。