33

如果你试图找出一个 int 是否在数字之间,为什么不能这样做:

if(10 < x < 20)

而不是它,你必须做

if(10<x && x<20)

这似乎有点开销。

4

11 回答 11

22

一个问题是三元关系构造会引入严重的解析器问题:

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

当您尝试使用典型的 PGS 用这些产生式表达语法时,您会发现在第一个<rel-op>. 解析器需要先行查看任意数量的符号,以查看是否有一秒钟的<rel-op>时间才能确定使用的是二进制还是三元形式。在这种情况下,您不能简单地忽略冲突,因为这会导致解析不正确。

我并不是说这种语法是致命的模棱两可。但我认为你需要一个回溯解析器来正确处理它。对于以快速编译为主要卖点的编程语言来说,这是一个严重的问题。

于 2010-01-03T04:48:53.997 回答
10

因为该语法根本没有定义?此外,x < y评估为布尔值,那是什么bool < int意思?这并不是真正的开销。此外,如果你真的想要,你可以写一个实用方法——我自己isBetween(10,x,20)不会,但是嘿......

于 2010-01-02T21:48:20.703 回答
10

这只是语法。'<' 是二元运算,大多数语言不使其具有传递性。他们本可以像你说的那样做,但是有人会问为什么你不能在三元中做其他操作。“如果 (12 < x != 5)”?

语法始终是复杂性、表达性和可读性之间的权衡。不同的语言设计者做出不同的选择。例如,SQL 有“x BETWEEN y AND z”,其中 x、y 和 z 可以单独或全部是列、常量或绑定变量。我很高兴在 SQL 中使用它,我同样很高兴不用担心为什么它不在 Java 中。

于 2010-01-02T21:49:20.737 回答
8

你可以自己做

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

编辑:抱歉检查 c 是否在 a 和 b 之间

于 2012-05-30T23:30:23.563 回答
7

10 < x && x < 20如果允许的话,与语言复杂性的增加相比,打字带来的不便是最小的10 < x < 20,因此 Java 语言的设计者决定不支持它。

于 2010-01-02T22:19:07.760 回答
6

COBOL 允许这样做(我相信其他一些语言也可以)。Java从不允许它的C继承了大部分语法。

于 2010-01-02T21:49:40.550 回答
4

您是人类,因此您理解术语“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

于 2010-01-02T21:55:22.553 回答
1

简化:

a = 10; b = 15; c = 20

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

这会检查 b 是否在 a 和 c 之间

于 2016-03-15T15:08:09.233 回答
0

因为<运算符(和大多数其他运算符)是二元运算符(它们有两个参数),并且(true true)不是有效的布尔表达式。

Java 语言设计者本可以设计该语言以允许使用您喜欢的类型的语法,但是(我猜)他们认为不值得使用更复杂的解析规则。

于 2010-01-02T21:49:00.940 回答
0

可以使用 Guava 库中的 Range 类:

 Range.open(10, 20).contains(n)

Apache Commons Lang 也有类似的类。

于 2021-12-25T07:14:46.943 回答
-5

if (10 < x || x < 20)

该语句将评估 10 到 20 之间的数字为真。这大致相当于10 < x < 20

于 2012-09-20T21:36:31.523 回答