• ベストアンサー

&&はかつ、andのことですよね。

http://okwave.jp/qa/q9284426.html の続き 下記の疑問が残っているので再質問しました。1はおそらく問題ないと思いますが、2がよくわかりません? &&はかつ、andのことですよね。 if (x === 1) { console.log('こんにちは'); } ← ❶ もしxが数値の1だったらこんにちはと出す。 x ===1 && console.log('こんにちは'); ← ❷ xが数値の1かつ、こんにちだったら?? &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか?

noname#226032
noname#226032

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8522/19371)
回答No.7

>なぜ条件式以外で使うかがよく理解できません。 実は「演算子は、式が書ける場所なら、どこで、どう使っても良い」のです。例えそれが「無意味」だとしても。 例えば、以下の例を見て下さい。 例❶ int x = 1; if (x === 1) { console.log('こんにちは'); } 次に、以下の例を見て下さい。 例❷ int x = 1; boolean b; b = x === 1; if (b) { console.log('こんにちは'); } 判定結果を、一旦、変数bに入れて、変数bの値がtrueかfalseかを、if文で判定しています。 どちらも「ifの条件式」には「trueかfalseになる式を書いている」のです。 例❷では「===演算子」を「if文の条件式以外の場所」で使っています。「変数bへの代入文の、代入する値の所」で使っています。 同様に、&&演算子も「if文の条件式以外の場所」で使って構わないのです。 例えば 例❸ int x = 1; int y = 2; boolean b; b = x === 1 && y === 2; if (b) { console.log('こんにちは'); } のように、代入文の「代入する値」の所で使っても構いません。 このように「論理演算子の&&や||は、if文の条件式以外の場所でも使用可能」なのです。 上記を踏まえて、以下の2つの例を見て下さい(計算だけして、出力も何もしない、無意味なプログラムです) 例❹ int x = 1; int y = 2; boolean b; b = x === 1 && y === 2; 例❺ int x = 1; int y = 2; int b; b = x + y; 例❹と例❺は「やってる事は違うけど、同じような構文」です。 「演算子が加算演算子か、論理積演算子か」の違いしかありません。 例❹も例❺も「変数bに代入しただけで、その後、変数bを使ってない」ので「変数bを宣言しない」「変数bに代入しない」ように書き換えできます。 例❻ int x = 1; int y = 2; x === 1 && y === 2; 例❼ int x = 1; int y = 2; x + y; ここで、例❻が「どこかで見覚えのあるプログラム」と似ていると思いませんか? 似ているのは x === 1 && y === 2; と x ===1 && console.log('こんにちは'); です。 「y === 2」の部分が「console.log('こんにちは')」に変わっただけで「やってる事は違うけど、同じような構文」になっています。 例❻も例❼も「計算だけ(式の評価)だけを行なって、評価した値を捨てている」ので、無意味なプログラムになっています(実行しても、結果を表示しない) このように「構文エラーにさえならなければ、演算子は、式が書ける場所なら、どこに、どのように使っても構わない」のです(「式が書ける場所だけ」ですので注意)

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

その他の回答 (14)

回答No.16

>IF(x===1 && console.log('こんにちは'); ) >だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 >左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 >どう区別するのでしょうか? 「()に囲まれていないときは、左が正しかった時だけ右を実行するという形に変わる」と言う認識は間違いです。 if(x===1 && console.log('こんにちは')){console.log('こんばんは');} ↑このようなと言う条件式が有ったとして、JavaScriptでは条件式は「ショートサーキット評価」されます。 この条件式の場合、「x===1」の式がfalseなら、(「console.log('こんにちは')」の式の帰り値が「true、false」に関係なく、この論理演算式「x===1 && console.log('こんにちは')」はfalseに確定しショートカットするので)「console.log('こんにちは')」の式は「評価されない(つまり実行されない)」、この条件式はfalseになるので「console.log('こんばんは')」も実行されない。 「x===1」の式がtrueなら、(この論理演算式「x===1 && console.log('こんにちは')」は「console.log('こんにちは')」の式の帰り値に依存するので、ショートカットせずに)「console.log('こんにちは')」の式も「評価される(つまり実行される)」、「console.log('こんにちは')」の帰り値はundefinedなので、(「x===1」の式がtrueなら)この条件式「x===1 && console.log('こんにちは')」の演算結果もundefinedになるようなので「console.log('こんばんは')」は実行されない。 つまり、この論理演算式の挙動の肝は「ショートサーキット評価」だと言う事です。 くどいようですが、「ショートサーキット評価」でない場合はショートカットはしない、「ショートサーキット評価」の場合は条件によってショートカットする、と言う事です。

回答No.15

訂正(2)です。 >>>こんかいはそもそも条件式でないのでこのようにならない。 >>console.log(~)の帰り値がundefinedだったとしても条件式です。 >>つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 >console.log(~)の帰り値がundefinedだったとしても"論理式"です。 >つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これで"論理式"です。 「x===1」の「===」比較演算子です、よって「x===1」は比較演算です。 「x===1 && console.log(~)」の「&&」は論理算子です、よって「x===1 && console.log(~)」は論理演算です。 条件式に特徴的に用いられる演算子として比較演算子、論理演算子などがある、と言う事です。

noname#226032
質問者

お礼

ありがとうございます。 難しいですね。 IF()となっていなければ条件式ではないと思ったのですが、 このような形でない条件式もあるのですね。 疲れました。 ただそれ以外の結果の実行部分に関しては正しいのですよね。

noname#226032
質問者

補足

>>>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら 「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、( 結果的にエラーだったとしても)これでも条件式です。 比較演算子、論理演算子などがある場合は、IF()のようになっていなくても条件式なのですね。 ただ条件式だったとしても下記はXが1だった時のみ右側を実行する。1出なかった場合は実行しないという結論は正しいのですね。 x ===1 && console.log('こんにちは'); IF(x ===1 && console.log('こんにちは'); ) だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 どう区別するのでしょうか?

回答No.14

訂正です。 >>こんかいはそもそも条件式でないのでこのようにならない。 >console.log(~)の帰り値がundefinedだったとしても条件式です。 >つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 console.log(~)の帰り値がundefinedだったとしても"論理式"です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これで"論理式"です。

回答No.13

>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、(結果的にエラーだったとしても)これでも条件式です。 >xが数値の1かつ、こんにちだったら。  その認識は間違ってます。 xが数値の1かつ、console.log(~)だったらです。 前述したとおり、console.log(~)の帰り値はundefinedなので「xが数値の1かつ、console.log(~)だったら」は「xが数値の1かつ、undefinedだったら」となります。 >&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? そうです。 >❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 偶然と言う表現はチョットちがうでしょう、実行した結果が同じようになるようにプログラマーが意図的に記述していると言う事です。 注意していただきたいのは、あくまでも「ショートサーキット評価」の場合の挙動だと言う事で、「ショートサーキット評価」でない場合には当てはまりません。

回答No.12

やっちまった。訂正 demo2 の最後のあたり。 setTimeout (demo2, 30); に。

回答No.11

肝心な事を忘れてた。 &&の右側の式の評価は何を返しても良いのです。 もともと式全体の評価なんて気にしていないのですから。 console.log(typeof console.log("")); console.log() は、 undefined を返します (true) && undefined なので、false が無駄に利用されず計算されました。

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

回答No.10

斜め横からちゃぶ台をひっくり返すようで申し訳ない。 これだけ説明されても私自身、教える方も学ぶ方も「なんでかなぁ~」と思ってしましました。 短く書くことが有意義なのですか?(過去の私は乱用してましたが) if 文で書けたらそれで良いのではないですか? 短く書くなら x ===1 && console.log('こんにちは'); ではなく x ==1 && console.log('こんにちは'); で、いいじゃん。 console.log の評価の結果と x が1なのかという評価の演算も余計にしているので、多分遅い(確かめていませんが) 以下で良し!! if (x==1) console.log('こんにちは'); -- "&" は、html文書の中のスクリプトにあると文法違反だし可読性にかけますよ。 -- 下に書いたプログラムの demo と demo2 は、同じ動きをします。 短く書くためだけのコードがメンテナンスしやすい(理解しやすい)とは限りません。 もっと短く書ける人もいるでしょうが、それはやっぱりお遊びであって・・・ <!DOCTYPE html> <meta charset="utf-8"> <title>説明は無理</title> <style> body {  color: white;  background: black; } p span {  position: absolute; } </style> <body> <p> <span>X</span> <script> var sx = 16, sy = 32, x = 0, y = 30, mx = 300, my = 300, g, h = document.querySelector ('span'), i = 1; function demo () {  h.style.top = y + 'px';  h.style.left = x + 'px';    x += sx * i;    if (mx < x) {   x = mx;   i = -i;   y += sy;   }  if (x < 0) {   x = 0;   i = -i;   y += sy;  }  if (y < my)   setTimeout (demo, 30); } function demo2 () {  h.style.top = y + 'px';  h.style.left = x + 'px';  (((mx < (x = x + sx * i) && (x = mx)) || (x < 0 && (x = 0, 1))) && (i = -i, y += sy) || y < my) && setTimeout (demo, 30); } demo2 (); // demo(); </script>

noname#226032
質問者

お礼

>>>こんかいはそもそも条件式でないのでこのようにならない。 console.log(~)の帰り値がundefinedだったとしても条件式です。 つまり、もしconsole.log(~)の帰り値がundefinedだったとしたら 「x ===1 && console.log('こんにちは')」は「x ===1 && undefined」と等価となります、( 結果的にエラーだったとしても)これでも条件式です。 比較演算子、論理演算子などがある場合は、IF()のようになっていなくても条件式なのですね。 ただ条件式だったとしても下記はXが1だった時のみ右側を実行する。1出なかった場合は実行しないという結論は正しいのですね。 x ===1 && console.log('こんにちは'); IF(x ===1 && console.log('こんにちは'); ) だったら両方が正しかった時のみ実行するとなりますが、()に囲まれていないときは、 左が正しかった時だけ右を実行するという形に変わると暗記するしかないのですかね。 どう区別するのでしょうか?

回答No.9

>>&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? >それは論理演算子です、「true、false 」の どちらかの値になります。 それは論理演算子で、&&は「かつ、and」の意味です、「true、false 」の どちらかの値になります。 JavaScriptの場合、ショートサーキット評価されます。 >ショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。 論理演算子の&&(and)を使いショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。

noname#226032
質問者

お礼

ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。1と2は違う式だが同じ結果になるということ。 if (x === 1) { console.log('こんにちは'); } ← ❶ else省略している。真だった時だけ{}ないを実行する。 もしxが数値の1だったらこんにちはと出す。 そうでなかった場合は何も表記されない。 偽は省略されている。 x ===1 && console.log('こんにちは'); ← ❷ 真だった時(xが数値の1だった場合)だけ&&以降を実行する。条件式ではないケースなので、両方当てはまった場合何かを実行するわけではない。 偽だった時(xが数値の1以外だった場合)は&&以降は実行されない。つまり何も表記されない。 条件式の場合はこのようになる。 xが数値の1かつ、こんにちだったら。  こんかいはそもそも条件式でないのでこのようにならない。 &&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? ❶と❷は「意味も書き方も全然違うが、実行した結果が、偶然、同じになる」のです。 ありがとうございました。上記の認識でよいですね。

回答No.8

>&&はかつ、andの意味と聞いていますが、この場合もこの意味でしょうか? それは論理演算子です、「true、false 」の どちらかの値になります。 JavaScriptの場合、ショートサーキット評価されます。 >x ===1 && console.log('こんにちは'); >xが数値の1かつ、こんにちだったら?? 「xが数値の1かつ、console.log(~)」だったらと言う事です。 >x ===1 && console.log('こんにちは'); ↑この場合、「x ===1」の式がfalseなら、(「console.log('こんにちは')」の式の帰り値が「true、false」に関係なく、この論理演算式「x ===1 && console.log('こんにちは')」はfalseに確定しショートカットするので)「console.log('こんにちは')」の式は「評価されない(つまり実行されない)」。 「x ===1」の式がtrueなら、(この論理演算式「x ===1 && console.log('こんにちは')」は「console.log('こんにちは')」の式の帰り値に依存するので、ショートカットせずに)「console.log('こんにちは')」の式も「評価される(つまり実行される)」。 ここで「評価されない(つまり実行されない)」、「評価される(つまり実行される)」と言う部分に注目して下さい(つまり「実行されない」、「実行される」と言う部分に注目して下さい)。 つまり「x ===1」でないなら「console.log(~)」は実行されない、「x ===1」なら「console.log(~)」は実行される、と言う事です。 ショートサーキット評価の性質を利用して「if (x === 1) { console.log('こんにちは'); } 」と同様の動作を実現しています。

  • f272
  • ベストアンサー率46% (8013/17127)
回答No.6

#2です。 > ・条件式以外で使う論理演算子 > すべてがtrueの場合はtrue返す。 > 左から順にfalseが出るまで処理を行いfalseが一回でも出れば、それ以降の処理は行わずfalseを返す 1.「条件式以外で使う」と限定しなくても,どこで使用しても同じです。 2. 上に書いたようなことは&&のときに限ります。 3. 詳しく言えばtrueやfalseではなくて,trueやfalseとみなせるものです。

関連するQ&A

  • ショートカット演算(短絡演算)について

    ショートカット演算(短絡演算) 以下の❶❷は意味的に等価です。 ◉リスト2-31 logical2.js if (x === 1) { console.log('こんにちは'); } ← ❶ x ===1 && console.log('こんにちは'); ← ❷ 上記は おそらく左がx=1ではないという仮定なので、左側がfalseになりこの時点で右側は実行されないので下記の二つは同じということだと思いますか?

  • 数学について。

    すみません。この続きのURLで、x→∞の時、f’(x)→∞も書かなくても、許容されるのでしょうか?教えていただけると幸いなのですが。 https://okwave.jp/qa/q9653170.html

  • JSについて教えてください。

    // FizzBuzz let i = 0; while(i < 100) { i++; if(i % 3 === 0){ console.log('Fizz'); continue; } if(i % 5 === 0){ console.log('Buzz'); continue; } if(i % 5 === 0 && i % 3 === 0){ console.log('FizzBuzz'); continue; } console.log(i); document.getElementsByClassName('js-test210')[0].innerHTML = i; } ・ 上記のように作成したのですが、 if(i % 5 === 0 && i % 3 === 0){ console.log('FizzBuzz'); continue; } の部分を一番上にもっていかないとこちらがうまくいかない理由がわかりますか? ・ continue; はこれ以下の処理は実行しないようにするという意味のようですが、 if内の記載以下の処理を実行しないようにするということなのでしょうか? ただそれだともともとそれ以下に何もないですよね???

  • andの意味について

    ※$a eq $b・・・$a と $b が等しい時に真 $a=1; $b=1; 下記の、例)2のandの意味が「且つ~~」として解釈していないと思うのですが、andの意味って( )の中と外だと意味が違ってくるのでしょうか。 下記の場合のandの違いを日本語訳で明確に理解したいのですが、どなたかご教授願えませんでしょうか。 例)1 if($a eq '1' and $b eq '1'){ 実行文; }else{ エラー文; } 例)2 ($a eq $b) and &Error('エラー。');

    • ベストアンサー
    • Perl
  • C言語の&に関する質問

    C言語で if (x == 0.0) (いろいろな計算) return x < 0.0 && (n & 1) ? -ans : ans; というプログラムがあるのですが、 最後のreturnのところで x がゼロ以下で且つ、n &1の場合には -ansを返し、そうでない場合にはansを返すとあるのですが、 n&1というのはどういう意味なのでしょうか? C言語で&と言えば、 http://www9.plala.or.jp/sgwr-t/c/sec14.html のページにあるように、ビットごとの AND演算子ですが、 この場合にはどういう意味で使われているのでしょうか?

  • paragon14で使っている部分だけをバックアッ

    下記の続き。 http://okwave.jp/qa/q9183079.html paragon14で使っている部分だけをバックアップしたいのですが、UIが変わっていて Partition raw processingが見当たりません? どこにあるかご存じないでしょうか?

  • and と then

    お世話になります。 今日は以下の問題です。 問題: (  )に入る適当な語を記せ、   One step further, (  ) you will fall over the precipice. 私の回答  : then 問題集の回答: and then という回答は私が問題を読んだ時に口をついて出てきてしまったのでそのまま書きました。 あとで回答を見ると and になっているので調べたのですが、 その本の中で and を要求しそうなのは  命令文 + and の使い方で   Hurry up, and you'll catch the bus. のような使い方ですが、どうも問題の文は命令文ではない。 それどころか文章として不完全なので、これは   If you go one step farther, の If you go が   省略された形だろうと解釈しました。 その前提で英辞朗で then を調べると以下の例文がありました。  If she takes good care of him, then we'll think about a bird. この文と  If you go one step farther, then you will fall over the precipice. は全く同じに見えます。また  If you go one step farther, and you will fall over the precipice. とも同じに見えます。 ここで質問ですが、and は接続詞、 then は副詞、形容詞、(名詞) となっています。 品詞が見事に違っているのに、ここまで同じ使い方、同じ意味を成すというのがどうも理解できません。 ○有り得ることでしょうか? ○それとも私の前提(If仮定文)や解釈に間違いがあり、  and にしなくてはならない積極的理由がありますか? ○また then でも使えるとした時、試験としては then でも  正解になるのでしょうか?(これはおまけの質問です) よろしくお願いします。

  • JavaScriptの問題に関して教えてください。

    下記問題の解き方および答えが考えても全然分からず、お教えいただきたいです。お願いいたします。 以下のプログラムを読んで、どういったプログラムなのかを説明してください。 let change = 0; let change_sum = 0; const data = [ 31, 41, 59, 26, 53, 58, 97, 93, 23, 84 ]; console.log("並べ替える前"); for (let i = 0; i < data.length; i++) { console.log(data[i] + " "); }// for console.log("\n"); console.log("***********************************"); console.log(""); for (let i = 0; i < data.length - 1; i++) { for (let j = i + 1; j < data.length; j++) { if (data[i] > data[j]) { let a = data[i]; data[i] = data[j]; data[j] = a; change++; }// if }// for(内側1) console.log((i + 1) + "回目"); console.log(`${change}回`); for (let k = 0; k < data.length; k++) { process.stdout.write(data[k] + " "); }// for(内側2) console.log("\n"); change_sum += change; change = 0; }// for(外側) //最終結果の表示 console.log("***********************************"); console.log(""); console.log(`${change_sum}回`); console.log("最終結果"); for (let i = 0; i < data.length; i++) { process.stdout.write(data[i] + " "); }// for console.log("");

  • (続)これってコーシーの積分公式の矛盾!?

    https://okwave.jp/qa/q9571473.html の続きです。 文字数が多くなってしまいましたので下記のアップしましたのでご覧いただけましたら幸いでございます。 https://kyokoyoshikawa.web.fc2.com/newdir/question/q9571473.txt

  • ”黄色いもの” と言えば貴方が一番に思い付くもの

    は何ですか? https://okwave.jp/qa/q10056791.html の続きです。

専門家に質問してみよう