トピック

条件式におけるANDと&&の違い

BUTTON() AND 1 THEN ~ BUTTON() AND 2 THEN ~ ↑それぞれ独立しており、ボタンの種類に合った仕事する。 BUTTON()&&1 THEN ~ BUTTON()&&2 THEM ~ ↑独立せず、押したボタンの種類に関わらず同時に仕事する。 ヘルプでは似たような表記だったのに何故このようなことが起きるのでしょうか?
1そうだね
プレイ済み
返信[1]
親投稿
ほしけん Hosiken
2進数ってわかりますか? 普段使ってる数字は0,1,2,…,9,10と、10で繰り上がるから10進数ですが、2進数は0,1,10,11,100… と2で繰り上がります。 ANDは、左辺と右辺を2進数の数字を比較して、どちらも1である桁が1になります。 6 AND 2 の場合… 6 … 2進数で 110 5 … 2進数で 101 両方とも1の桁を抜き出しと 100 、つまり10進数で4となります。 BUTTON()が返す数はボタンごとに2の累乗(1,2,4,8…)が割り当てられていて、これらは、2進数にすると、1がひとつしかありません(1,10,100,1000…)。これにより AND を使えば同時押しでも判定ができます。 いっぽうで && は、ふだん条件式の「なおかつ」の意味で使います。 AND との違いは、左辺と右辺両方が「0でない」場合は「1」、それ以外は「0」になります。
0そうだね
プレイ済み
返信[2]
親投稿
ほしけん Hosiken
したがって、たとえば 2 AND 4 は 0 になり、THEN になりませんが、 2 && 4 は 1 になり、THEN の処理が実行されます。 (一応補足ですが、IF ○○ THEN ~ は、○○の部分が「0でない」場合に THEN になります。)
0そうだね
プレイ済み
返信[3]
親投稿
おおみの Omi-no-mino-398
ANDはビットごとの論理積、&&は条件演算子なので役割が違います。 PRINT 2 AND 1 → 0を返す 2(&B10)と1(&B01)の論理積→結果0(&B00) PRINT 2 && 1 → 1を返す 条件式1(2)と条件式2(1)を評価し、両方TRUE(≠0)なので結果はTRUE ※条件式は0以外なら常にTRUE(1)を返す
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
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 .. と同じなので ... が実行される。
0そうだね
プレイ済み
返信[5]
親投稿
そういう仕様だと思ってください。 プチコンの「ビット演算子」(AND/OR/NOT/XOR)は、32桁の2進数の各桁毎に(32個同時に)、論理演算をして、32桁の2進数の結果を返す演算をします。 プチコンの「論理演算子」(&&/||/!)は、0を偽、0以外を真として論理演算をして1桁の真/偽の結果を返します。「論理演算子」の場合、左側の値で結果が真/偽が決まるときは、論理演算をサボります。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
ANDはビット演算子。&&は論理演算子です。 根本的な部分(0か1しかない場合)ではほぼ同じように動作しますが、それ以外では動作が変わってきます。 では、なぜマニュアルにおいて似たような扱いになっているかというと比較演算子(「==」や「>」や「<」等)を記述した場合は0と1として扱われるため「同じような動作」に相当するためです。 IF BUTTON() AND 1 THEN~ には比較演算子が含まれていません。したがって、ANDと&&は異なる動作になるわけです。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
変数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でも&&でもほぼ同じように動作します。
0そうだね
プレイ済み
返信[8]
親投稿
ほしけん Hosiken
> 6 AND 2 の場合… 訂正します。これは 6 AND 5 の間違いです。
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
ビット演算は2進数について理解しておけば簡単に理解できますが、2進数が分からなくてもボタンの入力判定だけで良いならば特定の値を取り出す命令として覚えておけば簡単です。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHjrpjduHA さらに詳しく知りたい場合は「プチコン3号 ボタン判定」などのキーワードでネット検索してください。
0そうだね
プレイ済み
返信[10]
親投稿
投稿内容からIFが抜けてた…反省。 AND・・・二つの数値の論理積を求め、条件式ではその結果が1(又はそれ以上)か0かで判定している。 &&・・・二つの条件が合致したとき処理するのではなく、それぞれが条件式として成立するときに処理。 つまり投稿にあるような例の場合、ANDを使った文はBUTTON()と後の数字の論理積を求めてそれが成り立つから個別に処理するけど、&&版はBUTTON()と後の数字でそれぞれ条件式を取った形になり、それが成立しているから個別での処理が不能。 ということですかね?
2そうだね
プレイ済み
返信[11]
親投稿
ほしけん Hosiken
あってます。2進数知ってる? とか聞くまでもなさそうですね。 両者はさらに演算子の優先順位が違います。 もしC言語が分かるなら、ほぼそのまんま & と && の違いと同じです。 元々BASICにはANDしかないのですが、3号でC言語から輸入されました。
0そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
> 条件式ではその結果が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 は、こういう仕様の論理式をあえて導入したってわけ。
1そうだね
プレイ済み
返信[13]
親投稿
まーくん isephiroth
itunesのスマートプレイリストの項目で言えば、&&は「すべての項目が一致」、andは「いずれかの項目が一致」と覚えてます
1そうだね
プレイ済み
返信[14]
親投稿
おおみの Omi-no-mino-398
その認識でOKです。 &&や||の結果はTRUE(1)かFALSE(0)の二通りだけになる、と覚えておくのがよいでしょう。 条件式の結果のTRUEとはMIKIさんの言うように「0であるか否か」なので、マイナスの値も 非0=TRUE となります。
0そうだね
プレイ済み
返信[15]
親投稿
おk把握 使い分けるにはもう少し時間が要りそうだけど何とか物に出来そうです。 回答してくださった方々ありがとうございました!!
0そうだね
プレイ済み