web-dev-qa-db-ja.com

(0 <5 <3)がtrueを返すのはなぜですか?

私はjsfiddle.netで遊んでいて、なぜこれがtrueに戻るのか興味がありますか?

if(0 < 5 < 3) {
    alert("True");
}

これもそうです:

if(0 < 5 < 2) {
    alert("True");
}

しかし、これはそうではありません:

if(0 < 5 < 1) {
    alert("True");
}

この癖は便利ですか?

343

操作の順序により、(0 < 5 < 3)((0 < 5) < 3)を生成する(true < 3)としてjavascriptで解釈され、trueは1としてカウントされ、trueを返します。

これは、(0 < 5 < 1)がfalseを返し、(0 < 5)がtrueを返す理由でもあり、1として解釈され、(1 < 1)になります。

433
Alan Geleynse

私の推測は、0 < 5が真であり、true < 3が真の1 < 3にキャストされるためです。

62
CaffGeek

おそらくtrue1 そう

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
21
Jack

なぜならtrue < 3、なぜならtrue == 1

17
Harmen

この癖がこれまでに役立つかどうかについての質問については、(凝縮されたコードがあなたのものである場合)それが役立つ場合があるかもしれませんが、それに依存することは(ほとんどの場合)あなたのコードの理解可能性を大幅に低下させます。

それは、大きな式の一部としてpost/pre increment/decrementを使用するようなものです。このコードの結果を一目で判断できますか?

int x = 5;
int result = ++x + x++ + --x;

注:このコードを使用すると、言語やコンパイラーによって異なる結果が得られることもあります。

自分自身と次の人の生活を楽にする誰があなたのコードを読むかを考えるのは良い考えです。ブール値の暗黙的な変換などの副作用に頼るのではなく、実際に何が起こりたいかを明確に書きます。

10
Zach Johnson

質問の2番目の部分への答え、「この癖はこれまでに有用ですか?」前の回答で述べたように、おそらくtrueが1にキャストされる言語(Javascript)の癖であるが、プログラマーは一般的に1とtrue(および0とfalse)を同じこと。

ただし、1がtrueで0がfalseのメンタルモデルがある場合、非常に便利で強力かつ直接的なあらゆる種類のNiceブールテクニックにつながります。たとえば、A> 100の結果でカウンターを直接インクリメントできます。これは、Aが100より大きい場合にカウンターをインクリメントします。この手法は、Javaの奇抜またはトリックと見なされますが、配列または関数型言語で慣用的かもしれません。

配列言語APLの典型的な例は、配列内の(たとえば)100を超えるアイテムの数をカウントすることです。

+/A>100

ここで、Aが5アイテムの配列である場合、107 22 256 110 3:

A>100

5項目のブール配列を生成します。

1 0 1 1 0

このブール結果を合計します:

+/1 0 1 1 0

最終的な答えが得られます:

3

この質問 は、特にm個のブール値のうちn個が真であるかどうかを判断するために問題が一般化されている場合に、この手法が非常に役立つ完璧な例です。

つのブール値のうち少なくとも2つが真であるかどうかを確認します

9
PAUL Mansour

簡単だ。

(0 < 5 < 3)

左から右に始めて、最初の0 <5を評価します。本当ですか?はい。 TRUE = 1であるため、1 <3と評価されます。1は3より小さいため、trueです。

これで

 (0 < 5 < 1)

0は5未満ですか?はい。したがって、1を意味するTRUEにしてください。その事実を念頭に置いて、(1 <1)と評価されます。 1は1未満ですか?いいえ、したがって、それは間違っています。それは等しくなければなりません。

7
netrox

0 <5を評価し、1 <3がtrueの場合にtrueを返します。

C#では、これを行うことができます「演算子「<」は、タイプ「bool」および「int」のオペランドには適用できません」

4
David

私は少し前にObj-Cでこれに遭遇し、それに非常に困惑しました。私はこのような何かをすることで私が望む結果を得ました:

if(0 < 5  && 5 < 3) {
alert("True");}

もちろん、これはfalseなので、「true」のアラートは表示されません。これを読んで良かったのですが、今ではその理由がわかりました。

4
Hippocrates

Pythonに加えて、CoffeeScriptは連鎖比較をサポートする別の言語であるため、3 < x < 10はVanilla JSで(3 < x && x < 10)に変換されます

4
Hippocrates
0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
3
truease.com

算術演算子を操作する場合、ブール値のオペランドは数値を返します。これを確認するには

true + 1  which gives you 2.

そう 0 < 5、返されたboolean(true)を数学演算子(<)で操作すると、数値が返されます。したがって、trueを返す1 <3になります

0は5未満であるため、trueを返します。デフォルトではtrueは、3未満の1を含むすべての値に評価され、再びtrueを返します。

0
ndoty