- ベストアンサー
JavaScript演算子「!」の条件式についての質問
- JavaScript演算子「!」の条件式の影響について質問があります。
- if文の条件は、$DR[1] = $DR[2] = $DR[3] = false;のコードの影響を受けるのでしょうか。
- 否定演算子「!」を使用してfalseをtrueに変換する場合、ドラムが止まっているという状態と矛盾するため、条件式は受けないと考えています。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
> だからif文条件式の$DR[x]はtrueということですよね。 そんなことは一言も言っていません。 この式では、これを実行している時点での$DR[x]の値を使用します。 それがtrueなのかfalseなのかは不明です。 「 !$DR[1] && !$DR[2] && !$DR[3] 」という式自体には、$DR[x]がtrueかfalseかを決定する機構はありません。 独学ということなので、あまり初球の解説書には書いてないけど重要なことを。 if ( 条件 ) {then節} else {節} 「条件が成立したら then節、不成立ならelse節を実行する」等と習っていると思います。 これは正確ではなく if ( 条件式 ) {then節} else {節} 「条件式の値が『真』ならば then節、『偽』ならelse節を実行する」 というのがより正しい意味です。 条件式は、普通の式と同じで、演算子に従って値を計算したものです。 5+3 が 8 になる、とかというのと同じ扱いです。 $DR[1] = $DR[2] = $DR[3] = false; の状態だったとします。 このときの式 !$DR[1] && !$DR[2] && !$DR[3] の値を「計算」します $DR[1]=falseなので、これを式に代入します ( ! false ) && !$DR[2] && !$DR[3] !falseを計算します true && !$DR[2] && !$DR[3] 論理積の計算では、 true && A = A です。これを使って !$DR[2] && !$DR[3] 同様に計算します (! false) && !$DR[3] true && !$DR[3] !$DR[3] ! false true ∴ 「$DR[1] = $DR[2] = $DR[3] = false;」⇒「!$DR[1] && !$DR[2] && !$DR[3] の値は true 」 $DR[x]は値を参照しただけで、変化しません。$DR[x]=trueでもありません。 ですが、式全体としては true になっています。 $DR[1] = true ならどうなるかは、御自身で計算してみてください
その他の回答 (9)
- babu_baboo
- ベストアンサー率51% (268/525)
こんばんは。 if 文の評価値を言葉に表してみたらわかりやすくなりませんか? もしくは、さらに混乱させてしまうか? 変数 DR[n] が true ならば、ドラムが回っているときですよね。 ドラムのどれかを停止したら、それは false になりますよね。 function StopRoll( _n ){ $DR[_n] = false;// ←これで停止 if(!$DR[1] && !$DR[2] && !$DR[3]){ ResultCheck(); } } !は、反対の意味を表すのだから、 if(!$DR[1] && !$DR[2] && !$DR[3]){ /*全てのドラムを回す*/; } 上は、ドラム1が回ってなくて、そしてドラム2も回ってなくて、 そしてドラム3も回っていないときなら・・・という意味で 逆な言い方をすれば、どれか一つでも回っていたなら?と考えれば if (DR[1] || DR[2] || DR[3]) { /*何もせず*/; } else { /*全てのドラムを回す*/; } どれか一つでも回っていなかったら? if (! (DR[1] || DR[2] || DR[3])) { /*全てのドラムを回す*/; } $DR[1] = $DR[2] = $DR[3] = false; は、初期化の時点で実行されるだけ。 ちなみに、 if(!$DR[1] && !$DR[2] && !$DR[3]){ は、「全てが回っていない」を確認するために3回チェックしています if (! (DR[1] || DR[2] || DR[3])) { は、仮にDR[1]が true なら後の2つは評価せず反転して実行するので、上のものよりも 早いときがあるよ。
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
- yukichance
- ベストアンサー率13% (9/67)
なんだろう?何が疑問かわからない・・・ !trueはfalse、!falseはtrueに同義というだけで !trueがfalse、!falseがtrueになるわけでなし、 true代入文、onclick文で呼んでない? if then文、trueだったら何かしない?
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 >true代入文、onclick文で呼んでない? >if then文、trueだったら何かしない? 私はHPを参考にコードを作っているわけではなく、HPのコードをなぞって書いていて、ちゃんと動作もします。ですが、そのコードが正しいのはわかるのですが、どうしてそうなるのか、という疑問があります。なので、他の書き方はわかりません。 >!trueはfalse、!falseはtrueに同義というだけで >!trueがfalse、!falseがtrueになるわけでなし、 恐らくこの辺りが私もわかっていないのだろうな、とは思うのです。ですが、それを説明しているつもりでもあります。要は、 $DR[1] = $DR[2] = $DR[3] = false; と if(!$DR[1] && !$DR[2] && !$DR[3]){ の、$DR[1]の真偽値がプログラムを動かしたときに今どうなっているのか、を知りたいのです。 皆さん、何度もお答えいただいてすいません。 私は独学でプログラムをしているので、出来るだけこちらで解決させていただきたいです。 今一度、ど素人の私にも伝わるよう、噛み砕いて教えていただけないでしょうか。 よろしくおねがいします。
- Gotthold
- ベストアンサー率47% (396/832)
> !$DR[1]と($DR[1] == false) > !$DR[2]と($DR[2] == false) > !$DR[3]と($DR[3] == false) > が同じ。 > だからif文条件式の$DR[x]はtrueということですよね。 「だから」の前後が全く繋がっていません。 なぜ$DR[x]はtrueということになってしまうのですか? $DR[1]がtrueの時には !$DR[1] という式は false と評価され、 $DR[1]がfalseの時には !$DR[1] という式は true と評価される、 というだけです。 逆に、 !$DR[1] という式が true と評価されたとき、$DR[1]は false なのに、あなたはなぜかtrueだと言い張っているように見えます。
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 >「だから」の前後が全く繋がっていません。 >なぜ$DR[x]はtrueということになってしまうのですか? !$DR[x]がfalseだからです。 ならば$DR[x]はtrueではないですか? $DR[x]がtrueだから、!$DR[x]がfalseになるのではないのですか? >$DR[1]がtrueの時には !$DR[1] という式は false と評価され、 >$DR[1]がfalseの時には !$DR[1] という式は true と評価される こういうことを私も言っているつもりなのですが、どこかおかしいでしょうか。!$DR[x]がfalseなら$DR[x]はtrueというのはなりたたないのでしょうか。 >逆に、 !$DR[1] という式が true と評価されたとき、$DR[1]は false なのに、あなたはなぜかtrueだと言い張っているように見えます。 これは私もfalseだと思いますよ。trueだというつもりはないです。 よろしくおねがいします。
- kmee
- ベストアンサー率55% (1857/3366)
そのコードは次のようになっています var $DR = new Array(); $DR[1] = $DR[2] = $DR[3] = false; // これと ☆ゲーム開始関数を作ります ... function GetStart(){ if(!$DR[1] && !$DR[2] && !$DR[3]){ // これ 記述してある箇所は近くても、実際に実行されるのは一緒ではありません。 $DR[1] = $DR[2] = $DR[3] = false; は、グローバル変数なので、スクリプトが最初に実行されたとき(≒ブラウザが読み込んだとき)に1回だけ実行されます。 if(!$DR[1] && !$DR[2] && !$DR[3]){ は、関数GetStartが呼び出されたときに実行されます。GetStartは何度も呼び出されるので、その度に実行されます。 最初の実行時は、$DR[x]は変化していないはずなので、 $DR[1] = $DR[2] = $DR[3] = false; が影響しますが、2回目以降は関係ありません。 > 仮に受けるとした場合、falseを!で否定するので、結果trueとなり、 > ドラムが止まっているときという状態と矛盾するので受けないとは思うのですが・・。 影響を受けるかどうかと、「falseを!で否定するので~」とは、まったく別の問題です。 このif文で判定するのは、これが実行された時点での$DR[x]の内容です。 !は真偽を否定(=真偽を反転)するだけです。 if ( $A ) とあったら、これは、 if ( $A == true ) であり if( $A != false ) です。 if (! $A ) とあったら、これは、 if ( $A != true ) であり if( $A == false ) です。 !$A としたからと言って、 $A 自体が変化するわけではありません。 f(!$DR[1] && !$DR[2] && !$DR[3]){ は if(($DR[1] == false) && ($DR[2] == false) && ($DR[3] == false)){ と等価です。 $DR[x]がfalseからtrueに変わるわけではありません
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 >f(!$DR[1] && !$DR[2] && !$DR[3]){ >は >if(($DR[1] == false) && ($DR[2] == false) && ($DR[3] == false)){ >と等価です。 ということは !$DR[1]と($DR[1] == false) !$DR[2]と($DR[2] == false) !$DR[3]と($DR[3] == false) が同じ。 だからif文条件式の$DR[x]はtrueということですよね。 この時点で$DR[x]がtrueということは 最初に実行された $DR[1] = $DR[2] = $DR[3] = false; と値が違います。 $DR[1] = $DR[2] = $DR[3] = false; は最初にスロットのドラムを止める意味を持っていますが、つまり、ドラムを止めた時点でfalseの値は実行された(消化された?)。だからif文で実行するときには$DR[x]の値はtrue(なぜそうなるのか分からないので教えていただけるとうれしいです)になる。ということでしょうか。 よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
一応ねんのため: $DR[1] = $DR[2] = $DR[3] = false; を実行したあとであっても, if 文の前に $DR[1] などを変更していたらそれはまた別の話. 常に「最後に代入した値」を持っているわけだし.
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 それならば、 $DR[1] = $DR[2] = $DR[3] = false; で$DR[1]、$DR[2]、$DR[3] の真偽値はfalse。 $DR[1]、$DR[2]、$DR[3]はfalseだから、次に実行されるスロットを回す関数の if(!$DR[1] && !$DR[2] && !$DR[3]){ の条件式の$DR[1]、$DR[2]、$DR[3]の真偽値もfalse。 なので!$DR[1] && !$DR[2] && !$DR[3]は、全てtrue。 ではないでしょうか。 実際はfalseでとまっている状態のとき、という条件だそうですが。 よろしくおねがいします。
- Tacosan
- ベストアンサー率23% (3656/15482)
$DR[1] = $DR[2] = $DR[3] = false; を実行したあとであれば ($DR[1] などの値が変わり, その値が条件で使われるという意味で) 影響を受ける. 当然.
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
- yukichance
- ベストアンサー率13% (9/67)
疑問なら、alert(x)で結果、出せばいい。 当方は、誤解しそうなコード、書かないが…
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 すいません、結果はHPのほうでだされていて、それが正しいことはわかっています。 私が疑問に思っているのは過程なので、alertで出しても解決にはなりません。 よろしくお願いします。
- lupin-333333
- ベストアンサー率31% (294/933)
そもそも、 >if文の条件はこのコードの影響を受け この「影響を受け」の表現がわからない。何のことをさし示しているのだろうか。 a=b=c=1; は、JavaScript だと、a b c に1を代入したことになる。それを「影響」?。まず、プログラミングの共通用語を学ぼう。 次に、 >falseを!で否定するので、結果trueとなり ”falseを ! で否定する” ????? 違う。共通用語、言語を正しく理解していないために起こる誤解だ。 これは、”変数 a が true でない時” と読むの共通用語だ。その逆も真なりで、”変数 a が false の時”と読む。 変数 $DR[1 は false が代入されたから、" ! $DR[1] " を評価(計算)すると、true の結果を返す。 中学時教えられた代数計算を思いうかべてみよう。 ---問題1---- F(x) = 2x + y と言う関数があります。X=2 Y=1の時、F(x)はいくつになりますか? ---------- 当然 5 となる。ここでの「F(x) = 2x + y」は単なる計算式だ。これをプログラミングすると var x=2, y=1 z = 2x + y となる。あなたの理論で行くと、”falseを ! で否定する” => ”2を 2 でかける”から 結果 4X2 = 6 となり・・・・ となる。 計算式(代数)に、数字を代入し計算するのが代数計算とよばれるゆえんなのだよ。
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 すいません、もっと具体的に書きます。 $DR[1] = $DR[2] = $DR[3] = false; で$DR[1]、$DR[2]、$DR[3] の真偽値はfalseです。 $DR[1]、$DR[2]、$DR[3]はfalseだから、次に実行される if(!$DR[1] && !$DR[2] && !$DR[3]){ の条件式の$DR[1]、$DR[2]、$DR[3]の真偽値もfalseではないかということです。 よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
「falseを!で否定するので、結果trueとなり、ドラムが止まっているときという状態と矛盾する」と思った理由は?
お礼
お答えいただきありがとうございました。 無事解決できたかと思います。 また疑問ができたらこちらでお聞きすると思うので、 そのときは、もしきが向いたらよろしくお願いします。
補足
お返事ありがとうございます。 すいませんが、その前にお聞きしたいです。 質問で書いたように if文の条件式は $DR[1] = $DR[2] = $DR[3] = false; の影響を受けるのでしょうか。
お礼
皆さんお返事ありがとうございました。 分かった気がします。 回答No10 kmee 様より >「条件が成立したら then節、不成立ならelse節を実行する」等と習っていると思います。~ >というのがより正しい意味です。 どうも私はif文の条件式の結果のtrueを「ドラムが回ったとき」と解釈していたからいけなかったようです。 「ドラムが回っている(true)ならスタートを押したときにthen節にいかない。ここの条件式でthen節にいくのは、ドラムが止まっているとき、つまりfalseのはず」と思い込んでいました。 恐らく皆さんは条件式trueなんだからthen節にいくのは当たり前だと考えられていたのだと思います。ですが、私はtrueなんだからドラムが回っている。だからthen節にいくのはおかしいと考えてしまっていました。ここでほしいのはtrueという値であって、ドラムが回っているかどうかという話ではない、ということですね。そもそもtrueとfalseのドラムの関係も独自に作者の方が定めたものでした。 なんだか言われれば当たり前のことをここまで悩んだのは恥ずかしい限りです。 たぶんこういうことですよね。 何度もお答えいただき、ありがとうございました。 かなり初歩的な話ですが、すっきりしました。 まだ何か的外れなことを言っていたら助言いただけるとうれしいです。