- ベストアンサー
javascriptの掛け算で不正解のアラートを表示するプログラムの不思議な動作について
- javascriptで掛け算の出題フォームにランダムな整数を入れ、入力された値の可否をアラートで表示するプログラムがあります。
- 不正解の場合、出力されるメッセージには不思議な点があります。なぜmyKotaeの前後に'+'がついているのか疑問に思っています。
- 調査した結果、javascriptの'+'演算子は数値の足し算や文字列の連結などに使われることが分かりましたが、なぜmyKotaeだけに'+''がついているのか理解できません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>("文字列A" + 変数 + ); と変数の前後に「+」が必要なのは >どうしてでしょうか? それは有り得ない。もっと前の方で「"」を忘れている行があるんじゃないかな? 当方が試した限り alert("はずれ ! こたえは "+myKotae+" です !"); でも alert("はずれ ! こたえは "+myKotae); でも alert(myKotae+" です !"); でも alert(myKotae); でも、ちゃんと動きましたよ。 逆に alert("はずれ ! こたえは "+myKotae+); って書いたら動かなくなっちゃったよ。 因みに alert(+myKotae+" です !"); でも alert(+myKotae); は、最初の「+」は、演算子じゃなくて「正負の符号」として働くから、エラーにはならないよ。
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
>不正解だった場合、 >「はずれ ! こたえは "+myKotae+" です!」 >と表示されるのですが それ、プログラム書き写し間違っている。 本当は 「はずれ ! こたえは 21 です!」 とか 「はずれ ! こたえは 12 です!」 とか 「はずれ ! こたえは 18 です!」 とかって表示になる筈。 本当に「はずれ ! こたえは "+myKotae+" です!」って表示されるんなら、根本的な「書き間違い」だよ。 例えば alert('はずれ ! こたえは "+myKotae+" です !'); って書いちゃうと「はずれ ! こたえは "+myKotae+" です!」って表示されちゃうよ。 >なぜ myKotae の前後に >『 + 』がついているのかわかりません。 「はずれ ! こたえは 」を、文字列定数として書きたいので「"」で括って「"はずれ ! こたえは "」と書いてます。 「 です!」を、文字列定数として書きたいので「"」で括って「" です!"」と書いてます。 そして、定数の「"はずれ ! こたえは "」と、変数の「myKotae」と、定数の「" です!"」を、連結して1つの文字列にしたいので「"はずれ ! こたえは "+myKotae+" です!"」と言う式を書いています。 alert("はずれ ! こたえは "+myKotae+" です !"); と言う文は 「alert(」、「"はずれ ! こたえは "」、「+」、「myKotae」、「+」、「" です !"」、「)」、「;」 に分解できるのです。 alert()は、「カッコの中に、引数(式)を1つだけ書く」のがお約束ですから "はずれ ! こたえは "+myKotae+" です !" と言う式を書いてあるのです。 >javascriptで『 + 』がどんな働きをするのか調べたら >数値を足したり文字列をつなげたりするとありました。 試しに、 alert("はずれ ! こたえは "+10+10+" です !"); に書き換えてみましょう。間違った答えを入れたらどうなりましたか? 「はずれ ! こたえは 1010 です !」 と表示されたはずです。 今度は、 alert("はずれ ! こたえは "+(10+10)+" です !"); に書き換えてみましょう。間違った答えを入れたらどうなりましたか? 今度は 「はずれ ! こたえは 20 です !」 と表示されたはずです。 「10+10」にカッコが無い場合、「"はずれ ! こたえは "+10」が先に演算されて「はずれ ! こたえは 10」が作られ、「作られた値+10」が演算されて「はずれ ! こたえは 1010」が作られ、更に「作られた値+" です !"」が演算され、最終的に「はずれ ! こたえは 1010 です !」が作られたのです。 「10+10」にカッコが有って「(10+10)」になっている場合、カッコの中の「10+10」が先に演算されて、数値として「20」が出来上がったあとに「"はずれ ! こたえは "+20」が演算されて「はずれ ! こたえは 20」が作られ、更に「作られた値+" です !"」が演算され、最終的に「はずれ ! こたえは 20 です !」が作られたのです。 カッコが無いと、式の中の「+」は「文字列を繋げる働き」しかしません。 一方、カッコが有ると、文字列を繋いだり、10+10を計算して20を求めたり、2通りの働きをします。 >なぜ"myKotae"だとダメなんですか? 式を良く見てみましょう。 "はずれ ! こたえは "myKotae" です !" と書いたら 「"はずれ ! こたえは "」「myKotae」「" です !"」 の3つが「演算子も無しに、並べて書いてあるだけ」になっちゃいますよ。当然、これはエラーです。 質問者さんは、間違って、文を「"はずれ ! こたえは 」「"+myKotae+"」「 です !"」と解釈しているので、混乱しているのではありませんか? 「"はずれ ! こたえは "」「+」「myKotae」「+」「" です !"」 で、「定数」+「変数」+「定数」、と言う式になっているのですよ。
- lupin-333333
- ベストアンサー率31% (294/933)
>"+myKotae"と後ろの「+」を省くとやはり正しく動作しません。。。 このような場合、具体的に何を、どうしたのか実例(コード)を書こうね。そうすれば、余計な説明が必要なくなります。多くはケアレスミス、書式違い、仕様です。
- Ogre7077
- ベストアンサー率65% (170/258)
関数を呼び出す構文は、 関数名 ( 値 ) ← 引数が一つの場合 関数名 ( 値 , 値 ) ← 引数が二つの場合 構文に反する記述をすると、エラーとなります。 関数名 ( 値 値 ) → 構文NG そこで二つの値を結合させ、一つの値を算出するプラス演算子の構文を使い、 値 + 値 → 値 最終的に問題のない構文に変換できます。 関数名 ( 値 + 値 ) → 関数名 ( 値 ) → 構文OK 三つの値を結合する演算子はありませんが、プラス演算子を再帰的に当てはめれば、 A + B + C → AB + C → ABC # AB = A と B を結合した値 # ABC = AB と C を結合した値 最終的に問題のない構文に変換できます。 関数名 ( 値 + 値 + 値 ) → 関数名 ( 値 + 値 ) → 関数名 ( 値 ) → 構文OK ゆえに 誤: alert("文字列A" 変数 "文字列B"); ← 関数名(値 値 値) 誤: alert("文字列A" + 変数 "文字列B"); ← 関数名(値 値) 正: alert("文字列A" + 変数 + "文字列B"); ← 関数名(値)
補足
早速のご回答、ありがとうございます! > 誤: alert("文字列A" + 変数 "文字列B"); ← 関数名(値 値) とのことですが、"文字列B" を連結しない場合も ("文字列A" + 変数 + ); と変数の前後に「+」が必要なのは どうしてでしょうか? もしよろしければ、是非また回答お願いいたします。
- web2525
- ベストアンサー率42% (1219/2850)
部分ではなく、全体を見て下さい alert("はずれ ! こたえは "+myKotae+" です !"); "+myKotae+" ではなくて "はずれ ! こたえは " と myKotae と " です !" です 文字列:はずれ ! こたえは 変数:myKotae 文字列:です ! を繋げるという意味での + です
補足
早速のご回答、ありがとうございます! 頂いた回答をもらって出てきた質問なのですが、 「+」はこの場合、文字列の連結の役割を持っているとのことですが、 例えば不正解だった場合の表示を「はずれ! こたえは●●です」 ではなく、「はずれ! こたえは●●」としたい場合も やはり「 + 」が必要なのはどうしてですか? ●●の後ろに連結したい文字列はないはずなのに "+myKotae"と後ろの「+」を省くとやはり正しく動作しません。。。 もしよろしければ、どうかまたご回答お願いいたします!
お礼
早速回答していただき、ありがとうございます! (2つの回答に対するお礼をまとめさせてもらいました) >不正解だった場合、 >「はずれ ! こたえは "+myKotae+" です!」 >と表示されるのですが 申し訳ないです、私の説明不足でした・・・! 実際は「はずれ ! こたえは ●● です!」 (●●にはその時の回答となる値が入る) と表示されます。 >質問者さんは、間違って、文を「"はずれ ! こたえは 」「"+myKotae+"」「 です !"」と解釈しているので、混乱しているのではありませんか? まさに、まさに!!その通りです。 分解の仕方を丁寧に解説していただいたおかげですべての誤解が解けました。 分かっている人が省いてしまう説明を噛み砕いて伝えてくださった chie65535様をベストアンサーとさせていただきます! 他の回答者様、 よく分かっていなくて的外れな質問をしていたのに 親切に回答してくださり感謝しています。 本当にありがとうございました!