90800


以下のような場合、なぜ`false`になるのでしょうか？

[code]

    const hoge = 200;
    console.log(300 >= hoge >= 50);
    
[/code]

以下の場合は`true`になり、違いがわかりません。

[code]

    console.log(300 >= hoge);
    console.log(hoge >= 50);
    
    console.log(300 >= hoge >= 0);
    console.log(300 >= hoge >= 1);
    
[/code]


CC BY-SA 4.0
2022-08-27T13:23:48.287
90798
2022-08-28T00:24:50.390
54172
question
javascript
(300 >= 200 >= 50) ←この式はなぜfalseになるのでしょうか？


(MDN Web Docs)
[式と演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators),
[演算子の優先順位](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)  
によると, 比較演算子は 優先順位 10と 9で, 結合性は左から右となっています

比較演算子の演算 `a OP1 b OP2 c` では(左から右なので)  
`(a OP1 b) OP2 c` のように処理される(解釈される)ということ

`300 >= 200 >= 0` を当てはめてみると

  1. `(300 >= 200) >= 0`
  2. `true >= 0`
  3. `1 >= 0` // trueは数値で見ると (JavaScriptでは)`1`なので
  4. `true`

… という具合

* * *

`300 >= hoge >= 50` このような比較は, 一部の言語でしかサポートされていない模様 (JavaScriptでは無理)  
たとえば (docs.python.org)
[比較](https://docs.python.org/ja/3/reference/expressions.html#comparisons)

> 比較はいくらでも連鎖することができます。例えば `x < y <= z` は `x < y and y <= z`
> と等価になります。ただしこの場合、前者では `y` はただ一度だけ評価される点が異なります (どちらの場合でも、 `x < y` が偽になると `z`
> の値はまったく評価されません)。  
>  形式的には、 a, b, c, ..., y, z が式で op1, op2, ..., opN が比較演算子である場合、 `a op1 b op2
> c ... y opN z` は `a op1 b and b op2 c and ... y opN z`
> と等価になります。ただし、前者では各式は多くても一度しか評価されません。  
>  `a op1 b op2 c` と書いた場合、 a から c までの範囲にあるかどうかのテストを指すのではないことに注意してください。例えば `x <
> y > z` は (きれいな書き方ではありませんが) 完全に正しい文法です。

Pythonでは `300 >= hoge >= 50` (比較の連鎖)は `300 >= hoge and hoge >= 50` のように
(普通の)二項演算子の組み合わせによる演算のように解釈されます


CC BY-SA 4.0
2022-08-27T14:29:27.157
90800
2022-08-28T00:24:50.390
2022-08-28T00:24:50.390
43025
43025
90798
answer