Подтвердить что ты не робот

Проверьте, существует ли int между двумя номерами

Почему вы не можете сделать это, если попытаетесь выяснить, находится ли int между цифрами:

if(10 < x < 20)

Вместо этого вам нужно будет сделать

if(10<x && x<20)

который кажется немного накладным.

4b9b3361

Ответ 1

Одна из проблем заключается в том, что тройная реляционная конструкция приведет к серьезным проблемам парсера:

<expr> ::= <expr> <rel-op> <expr> |
           ... |
           <expr> <rel-op> <expr> <rel-op> <expr>

Когда вы пытаетесь выразить грамматику с этими произведениями, используя типичный PGS, вы обнаружите, что конфликт с уменьшением сдвига в точке первого <rel-op>. Синтаксический разбор должен искать произвольное количество символов, чтобы увидеть, есть ли второй <rel-op>, прежде чем он сможет решить, была ли использована бинарная или тройная форма. В этом случае вы не можете просто игнорировать конфликт, потому что это приведет к неправильному анализу.

Я не говорю, что эта грамматика смертельно неоднозначна. Но я думаю, вам понадобится парсер для отслеживания, чтобы справиться с этим правильно. И это серьезная проблема для языка программирования, где быстрая компиляция является важной точкой продажи.

Ответ 2

Потому что этот синтаксис просто не определен? Кроме того, x < y оценивается как bool, так что означает bool < int? На самом деле это не накладные расходы; кроме того, вы могли бы написать полезный метод, если вы действительно хотите - isBetween(10,x,20) - я бы не сам, но эй...

Ответ 3

Это просто синтаксис. '& Л;' является бинарной операцией, и большинство языков не делают ее транзитивной. Они могли бы сделать это так, как вы говорите, но тогда кто-то спросит, почему вы не можете делать другие операции в trinary. "если (12 < x!= 5)"?

Синтаксис всегда является компромиссом между сложностью, выразительностью и удобочитаемостью. Различные дизайнеры языка делают разные варианты. Например, SQL имеет "x BETWEEN y AND z", где x, y и z могут индивидуально или все быть столбцами, константами или связанными переменными. И я рад использовать его в SQL, и я также рад не беспокоиться о том, почему это не на Java.

Ответ 4

Неудобство ввода 10 < x && x < 20 минимально по сравнению с увеличением сложности языка, если разрешить 10 < x < 20, поэтому разработчики языка Java решили не поддерживать его.

Ответ 5

Вы можете сделать свой собственный

public static boolean isBetween(int a, int b, int c) {
    return b > a ? c > a && c < b : c > b && c < a;
}

Изменить: извините, если c находится между a и b

Ответ 6

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

Ответ 7

Вы человек, и поэтому вы понимаете, что означает термин "10 < x < 20". У компьютера нет этой интуиции, поэтому он читает его как: "(10 < x) < 20".

Например, если x = 15, он будет вычислять:

(10 < x) = > TRUE

"TRUE < 20" = > ???

В программировании на C это будет хуже, поскольку нет значений True\False. Если x = 5, вычисление будет:

10 < x = > 0 (значение False)

0 < 20 = > non-0 number (True)

и, следовательно, "10 < 5 < 20" вернет True!: S

Ответ 8

Поскольку оператор < (и большинство других) - это двоичные операторы (они принимают два аргумента), а (true true) не является допустимым булевым выражением.

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

Ответ 9

упрощение:

a = 10; b = 15; c = 20

 public static boolean check(int a, int b, int c) {
        return a<=b && b<=c;
    }

Это проверяет, находится ли b между a и c

Ответ 10

if (10 < x || x < 20)

Этот оператор будет оценивать значение true для чисел от 10 до 20. Это приблизительный эквивалент 10 < x < 20