投稿
ネタバレ
say sayer.exe
IF文を使わずにキャラクタを動かしてみた
10そうだね
プレイ済み
返信[1]
親投稿
say sayer.exe
昔良く使われてた方法です 6~9行目がIF文の代わりです
0そうだね
プレイ済み
返信[2]
親投稿
Lejenne roberingue2012
それ、ワタシも使ってる。笑
0そうだね
プレイ済み
返信[3]
親投稿
子供の頃これが意味不明すぎて高い高い壁だった
0そうだね
プレイ済み
返信[4]
親投稿
ゆうたん yu-tan-sama
んーと 比較結果として返ってくる値が、TRUE=1、FALSE=0であることに期待した実装…でいいのかな? 戻り値としてのTRUE=1に絶対の確信がもてないから個人的には怖くて使えないや
2そうだね
プレイ済み
返信[5]
親投稿
say sayer.exe
確かに、NOT FALSE(つまりTRUE)って-1ですからね そのくせ、NOT TRUE(つまりFALSEになるはず)は-2になっちゃうし(FALSEは0) …これって重大なバグかも?
0そうだね
プレイ済み
返信[6]
親投稿
say sayer.exe
試しに A=TRUE  '① WHILE 1 IF A THEN ? "TRUE "; ELSE ? "FALSE "; A=NOT A WEND て、やってみた いつまで経ってもFALSEて出てこないじゃねーか# そのくせ①を A=FALSE に変えたら FALSE TRUE FALSE TRUE FALSE ... て交互に出るし
0そうだね
プレイ済み
返信[7]
親投稿
ウッノ uxtuno
NOTはビット反転なのでそれで合ってるはずですよ TRUEとFALSEを反転したければ「!」が使えます 例) A=TRUE IF !A THEN ?"FALSE"
0そうだね
プレイ済み
返信[8]
親投稿
ウッノ uxtuno
おっと間違いこのIF文入らないわ
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
X=X+((B AND 8)==8)-((B AND 4)==4) は比較演算を省略して X=X+(8AND B)/8-(4AND B)/4 と記述することも可能ですね。 私はプチコンmkIIで20通り以上方法で8方向移動のプログラムを作りましたが剰余を使ったものが最も短くできました。 ただし、mkIIの剰余の演算子は「%」の1文字だったのに対してプチコン3号は「MOD」の3文字なので剰余のアドバンテージはあまり無くなっています。
0そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
あとNOTについてですがウッノさんが書いておられるようにビット反転であり、論理反転ではないのでNOT 1が0にならないのは正しいです。 1を2進数で表すと  00000000000000000000000000000001 これをビット反転すると  11111111111111111111111111111110 これを10進数で表すと  -1 つまり、NOT Aというのは-A-1と等しくなるわけです。
1そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
補足すると11111111111111111111111111111110が-1になるのは符号付き32bit整数の場合です。(プチコン3号はこれに相当する) 符号無しだと2^32-2という値(^は累乗を示す)になりますね。
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
訂正 11111111111111111111111111111110 は 「-1」ではなく「ー2」です(笑)
0そうだね
プレイ済み
返信[13]
親投稿
say sayer.exe
問題点は NOT FALSE == TRUE NOT TRUE != FALSE に、なってるていうこと TRUE=1 と設定してる事を「バグだ」と言いたいのです はなっから TRUE=-1 と設定してれば、わざわざビット演算等の説明も必要もないのに…
0そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
NOTの処理がバグと言っているのではなくTRUEが1、FALSEが0になっているのをバグと言っておられるのでしょうか?(NOT 0が-1になるのはNOTの仕様としては正しいものです) それならば、TRUEの値が1になるのか-1になるのかは処理系に依存しますのでバグではなく単なる仕様でしかないですね。 ビット演算と論理演算は似て非なるものなので気を付けましょう。 あくまでNOTはビット演算子であり、論理演算子ではないので論理反転を行う「!」が用意されているわけです。
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
長くなりましたが、要点をまとめると NOT TRUE、NOT FALSEという書き方は処理系に依存した書き方(少なくともプチコン3号では正しくない)なので!TRUE、!FALSEと書きましょうということです。
0そうだね
プレイ済み
返信[16]
親投稿
Godot orz_127
コンピュータの世界では、偽が0、真が0以外となっている筈です。 真は正でも負でも、0でなければ1以外でも、さらに整数である必要もありません。 便宜上、定数が用意され、FALSEは0、TRUEは1とさている事が多いようです。 また、比較演算子による比較結果も偽(0)か真(1)に分けられる様です。 昔のパソコンでは、NECのPC-80、88等は真の場合1と定義されていました。所が富士通のFM-7では-1と定義されていました。 PC-88とFM-7で移植を行う場合、投稿にあるような処理は、符合を反転させる、というのが注意点のひとつでした。 フチコン3では真は1となっている様です。 という訳で if 0 は偽として判断されるとしてこれまで生きてきましたが、最近知った驚愕な事実として if 0 が真と判定される言語もあるんだよとwww 思い込みにはご注意ください。
0そうだね
プレイ済み
返信[17]
親投稿
けい kei0baisoku
私も買って最初に書いたプログラムで、sayさんと同じ勘違いをしてはまりかけました。 思い付いてWebのマニュアル見なかったら解決しなかったと思います。 論点からは少し外れるかも知れませんが、紛らわしい諸悪の根元は、名前が「NOT」なのに否定じゃないことだと思います。あと「AND」と「OR」なのにかつと又はでもないのも。 (昔からのBASICの名残だからと聞きました)
0そうだね
プレイ済み
返信[18]
親投稿
say sayer.exe
ビット演算と論理演算とを分けて考えるのどうなんでしょうね? いくら考えても無駄にしか思えんのです まあ「そういう仕様」だと思えば、特に違和感はありませんが ☆「そういう仕様」で考えて上のプログラムを出してみた  ↑そしたら変な疑問を投げられた   ↑考えてみたらおかしいくさい→論理バグじゃね?    ↑フルボッコ←今ここ 知らんほうが良かったかもw
0そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
sayさんへ 論理演算とビット演算を同じに考えるということは IF 2 && 4 THEN @TRUE と IF 2 AND 4 THEN @TRUE が同じ結果にならないとおかしいというようなものです。 まぁ本質的には各ビット単位で論理演算を行うのがビット演算になるわけだから「ビット演算と論理演算は全くの別物」というわけでもありませんが。 けいさんへ NOTはビット単位で論理否定(論理反転)を行うものなのでNOTの名前に偽りはないと思いますよ。 ビット単位で考えないのならばNOTだけではなくANDやORも意味不明になってしまいますよね。
0そうだね
プレイ済み
返信[20]
親投稿
Godot orz_127
ちなみに前のコメントの if 0 が真となる言語はRubyです。この言語の場合、0は0という数値のオブジェクトが存在すると捉えるため、偽にはならないとのことです。 言われなければ気付かないよ…。 だって0は0じゃん orz 動作確認していて遅くなりましたが、! の方は画像のような動きのようです。 TRUE/FALSEの反転はプチコン3では「!」を使う方が良いようです。 実は自分もsayさんのように書いていて最初NOTであれれ?となった人ですw 知らなかっただけかもですが、昔のBASICは&&とか||とか!はなかった気がC言語で初めてでて来た気がします。
1そうだね
プレイ済み
返信[21]
親投稿
けい kei0baisoku
>おちゃめさん なるほど、それぞれのビットを「否定」「両方がonか」「どちらかがonか」と言う意味で捉えれば名前と仕様も一致してますね。 ただ、私の感じている紛らわしさは、純粋な「NOT」という英単語の意味とSmileBasicでの「否定」の書き方との食い違いです。 ビット演算を知っていて「プチコンではどう書くんだろう」のような順番で考えたならNOTがそうかもと考える人もいると思いますが、特にビット演算を知らなくて、「○○ではない、って書きたいけどどうやるんだろう」と探してNOTの記述を見つけた時に、「いやコレは違うかも」と疑うのはまず無理だと思います。 という部分の、言葉の意味と仕様との食い違いです。
0そうだね
プレイ済み
返信[22]
親投稿
ゆうたん yu-tan-sama
目的が別だから分けて考えるのは当然だと思いますよ~ 言語によってはデータ型からして分離するほどですし 論理演算の存在とか、TRUEやFALSEの値をどう定義しているかは、機械語のフラグレジスタや分岐命令の仕様に起因するのかな? そっち方面に足を踏み入れると深みにはまりそうだから「そういう仕様」としておいた方がよいかと思います
2そうだね
プレイ済み
返信[23]
親投稿
say sayer.exe
「そういう仕様」で片付けたんだけど、まだ死体に鞭打たれてます。はい しこしこ一画面プログラム作ってりゃよかったorz
0そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
けいさんへ NOT、AND、ORという名称は論理回路から来てます。 したがって、英単語の直訳とはニュアンスが変わっている部分もあることでしょう。 英単語の直訳で考えると「PRINT」は「印刷」なので「プリンターが繋がらないプチコンで何を印刷するの?」という感じになってしまいます。 そういう点から考えるとプログラミングと英語ってほとんど無関係といっても良いかもしれませんね。(直訳で考えたらおかしな命令がたくさんあります)
1そうだね
プレイ済み
返信[25]
親投稿
けい kei0baisoku
(遅れての上に元のsayさんの悩みは解決してるので恐縮ですが………(^^;) >おちゃめさん 物理的な回路名から来ているのは聞いたこともあるので、「論理演算の表記をどうするか」というテーマならば、NOTやANDの表記で適切だと私も思います。 sayさんの疑問を見て感じたのは、由来の有無や仕方ないかどうかは置いといて、純粋に名前と実態の食い違いが勘違いの原因になっているという点です。 ちょっと極端な例かもしれませんが、例えば論理演算の「または」が歴史的な背景とかからプチコンで「+」と表記していたとして、由来の説明がつくかどうかとは関係無く、「+」を見たら足し算だと思い込む人がほとんどだと思います(特にプログラム初心者)。この例と全く同じ認識です。 スマイルブームさんの中でも今作でどうするか検討はあったと思いますが、単純に変えれば良い訳ではないけれども、ベストでもない、と私は考えています。
1そうだね
プレイ済み