Почему (0 <5 <3) возвращает true? - PullRequest
343 голосов
/ 03 ноября 2010

Я играл на jsfiddle.net, и мне интересно, почему это возвращает true?

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

Так же это:

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

Но это не так:

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

Является ли эта причуда когда-нибудь полезной?

Ответы [ 13 ]

434 голосов
/ 03 ноября 2010

Порядок операций приводит к тому, что (0 < 5 < 3) интерпретируется в javascript как ((0 < 5) < 3), что приводит к (true < 3), а значение true считается как 1, в результате чего возвращается значение true.

Именно поэтому (0 < 5 < 1) возвращает ложь, (0 < 5) возвращает истину, что интерпретируется как 1, что приводит к (1 < 1).

62 голосов
/ 03 ноября 2010

Я предполагаю, что 0 < 5 - это истина, а true < 3 получает приведение к 1 < 3, что является истиной.

21 голосов
/ 03 ноября 2010

вероятно, потому что true принимается за 1, поэтому

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true
17 голосов
/ 03 ноября 2010

Потому что true < 3, потому что true == 1

10 голосов
/ 03 ноября 2010

Что касается вашего вопроса, является ли эта причудливость когда-либо полезной: я полагаю, что мог бы быть какой-то случай, когда он был бы полезен (если вам нужен сжатый код), но полагаться на него (скорее всего) значительно снизит пониманиеваш код.

Это похоже на использование post / pre increment / decment как части больших выражений.Можете ли вы определить результат этого кода с первого взгляда?

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

Примечание: с помощью этого кода вы можете иногда даже получать разные результаты в зависимости от языка и компилятора.

Хорошая идея - сделать жизнь проще для себя и для следующего парня , который будет читать ваш код.Четко напишите, что именно вы хотите, чтобы происходило, а не полагайтесь на побочные эффекты, такие как неявное преобразование логических значений.

9 голосов
/ 27 ноября 2010

Ответ на вторую часть вопроса: "Этот причуды когда-нибудь полезны?" возможно, нет, как отмечалось в предыдущем ответе, если это действительно изюминка языка (Javascript), значение true приведено к 1, но в общем случае программист не видит 1 и true (и 0 и false) как то же самое.

Если, однако, у вас есть ментальная модель, в которой 1 является истинным, а 0 ложным, то это приводит к всевозможным хорошим логическим методам, которые являются чрезвычайно полезными, мощными и прямыми. Например, вы могли бы увеличить счетчик напрямую с результатом 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

Этот вопрос является прекрасным примером того, где этот метод был бы очень полезен, особенно если обобщить задачу, чтобы определить, истинны ли n из m логических значений.

Проверьте, верно ли хотя бы два из трех логических значений

7 голосов
/ 04 ноября 2010

Это просто.

(0 < 5 < 3)

Начните с слева направо, чтобы оценить первые 0 <5. Это правда? Да. Так как TRUE = 1, он оценивает 1 <3. Так как 1 меньше 3, так что это правда. </p>

Теперь с этим

 (0 < 5 < 1)

0 меньше 5? Да. Поэтому сделайте его ИСТИННЫМ, что также означает 1. Теперь, имея в виду этот факт, оно оценивается как (1 <1). 1 меньше 1? Нет, поэтому это неверно. Это должно быть равным. </p>

4 голосов
/ 29 октября 2012

В дополнение к python, CoffeeScript является еще одним языком, который поддерживает цепные сравнения, поэтому 3 < x < 10 будет преобразовано в (3 < x && x < 10) в ванильном JS

4 голосов
/ 03 ноября 2010

Я столкнулся с этим некоторое время назад в Obj-C и был очень озадачен этим. Я получил желаемые результаты, сделав что-то вроде этого:

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

Что, конечно, неверно, поэтому вы не получите это "истинное" предупреждение. Рад, что прочитал это, теперь я знаю, почему.

4 голосов
/ 03 ноября 2010

вычисляет ли он 0 <5, который вернул бы 1 для истины, когда 1 <3, что является истиной? </p>

C # хочет позволить вам сделать это «Оператор» <'не может быть применен к операндам типа' bool 'и 'int' "</p>

...