如果你试图找出一个 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 < int
意思?这并不是真正的开销。此外,如果你真的想要,你可以写一个实用方法——我自己isBetween(10,x,20)
不会,但是嘿......
这只是语法。'<' 是二元运算,大多数语言不使其具有传递性。他们本可以像你说的那样做,但是有人会问为什么你不能在三元中做其他操作。“如果 (12 < x != 5)”?
语法始终是复杂性、表达性和可读性之间的权衡。不同的语言设计者做出不同的选择。例如,SQL 有“x BETWEEN y AND z”,其中 x、y 和 z 可以单独或全部是列、常量或绑定变量。我很高兴在 SQL 中使用它,我同样很高兴不用担心为什么它不在 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 之间
10 < x && x < 20
如果允许的话,与语言复杂性的增加相比,打字带来的不便是最小的10 < x < 20
,因此 Java 语言的设计者决定不支持它。
COBOL 允许这样做(我相信其他一些语言也可以)。Java从不允许它的C继承了大部分语法。
您是人类,因此您理解术语“10 < x < 20”的含义。计算机没有这种直觉,所以它读作:“(10 < x) < 20”。
例如,如果 x = 15,它将计算:
(10 < x) => 真
“真 < 20” => ???
在 C 编程中,情况会更糟,因为没有 True\False 值。如果 x = 5,则计算为:
10 < x => 0(False 的值)
0 < 20 => 非 0 数(真)
因此 "10 < 5 < 20" 将返回 True!:S
简化:
a = 10; b = 15; c = 20
public static boolean check(int a, int b, int c) {
return a<=b && b<=c;
}
这会检查 b 是否在 a 和 c 之间
因为<
运算符(和大多数其他运算符)是二元运算符(它们有两个参数),并且(true true)
不是有效的布尔表达式。
Java 语言设计者本可以设计该语言以允许使用您喜欢的类型的语法,但是(我猜)他们认为不值得使用更复杂的解析规则。
可以使用 Guava 库中的 Range 类:
Range.open(10, 20).contains(n)
Apache Commons Lang 也有类似的类。
if (10 < x || x < 20)
该语句将评估 10 到 20 之间的数字为真。这大致相当于10 < x < 20