Почему вы не можете сделать это, если попытаетесь выяснить, находится ли int между цифрами:
if(10 < x < 20)
Вместо этого вам нужно будет сделать
if(10<x && x<20)
который кажется немного накладным.
Почему вы не можете сделать это, если попытаетесь выяснить, находится ли int между цифрами:
if(10 < x < 20)
Вместо этого вам нужно будет сделать
if(10<x && x<20)
который кажется немного накладным.
Одна из проблем заключается в том, что тройная реляционная конструкция приведет к серьезным проблемам парсера:
<expr> ::= <expr> <rel-op> <expr> |
... |
<expr> <rel-op> <expr> <rel-op> <expr>
Когда вы пытаетесь выразить грамматику с этими произведениями, используя типичный PGS, вы обнаружите, что конфликт с уменьшением сдвига в точке первого <rel-op>
. Синтаксический разбор должен искать произвольное количество символов, чтобы увидеть, есть ли второй <rel-op>
, прежде чем он сможет решить, была ли использована бинарная или тройная форма. В этом случае вы не можете просто игнорировать конфликт, потому что это приведет к неправильному анализу.
Я не говорю, что эта грамматика смертельно неоднозначна. Но я думаю, вам понадобится парсер для отслеживания, чтобы справиться с этим правильно. И это серьезная проблема для языка программирования, где быстрая компиляция является важной точкой продажи.
Потому что этот синтаксис просто не определен? Кроме того, x < y
оценивается как bool, так что означает bool < int
? На самом деле это не накладные расходы; кроме того, вы могли бы написать полезный метод, если вы действительно хотите - isBetween(10,x,20)
- я бы не сам, но эй...
Это просто синтаксис. '& Л;' является бинарной операцией, и большинство языков не делают ее транзитивной. Они могли бы сделать это так, как вы говорите, но тогда кто-то спросит, почему вы не можете делать другие операции в trinary. "если (12 < x!= 5)"?
Синтаксис всегда является компромиссом между сложностью, выразительностью и удобочитаемостью. Различные дизайнеры языка делают разные варианты. Например, SQL имеет "x BETWEEN y AND z", где x, y и z могут индивидуально или все быть столбцами, константами или связанными переменными. И я рад использовать его в SQL, и я также рад не беспокоиться о том, почему это не на Java.
Неудобство ввода 10 < x && x < 20
минимально по сравнению с увеличением сложности языка, если разрешить 10 < x < 20
, поэтому разработчики языка Java решили не поддерживать его.
Вы можете сделать свой собственный
public static boolean isBetween(int a, int b, int c) {
return b > a ? c > a && c < b : c > b && c < a;
}
Изменить: извините, если c находится между a и b
COBOL позволяет это (я уверен, что некоторые другие языки также работают). Java унаследовала большую часть этого синтаксиса из C, который не позволяет его.
Вы человек, и поэтому вы понимаете, что означает термин "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
Поскольку оператор <
(и большинство других) - это двоичные операторы (они принимают два аргумента), а (true true)
не является допустимым булевым выражением.
Разработчики языка Java могли бы спроектировать язык, чтобы разрешить синтаксис как тот тип, который вы предпочитаете, но (я предполагаю) они решили, что это не стоит более сложных правил синтаксического анализа.
упрощение:
a = 10; b = 15; c = 20
public static boolean check(int a, int b, int c) {
return a<=b && b<=c;
}
Это проверяет, находится ли b между a и c
if (10 < x || x < 20)
Этот оператор будет оценивать значение true для чисел от 10 до 20.
Это приблизительный эквивалент 10 < x < 20