如果您尝试查找一个整数是否在两个数字之间,为什么不能这样做:
if(10 < x < 20)
你不再使用它,而是要做
if(10<x && x<20)
这似乎会增加一些额外的开销。
如果您尝试查找一个整数是否在两个数字之间,为什么不能这样做:
if(10 < x < 20)
你不再使用它,而是要做
if(10<x && x<20)
这似乎会增加一些额外的开销。
问题之一是,三元关系结构会引入严重的解析器问题:
<expr> ::= <expr> <rel-op> <expr> |
... |
<expr> <rel-op> <expr> <rel-op> <expr>
当你试图用典型的自下而上语法分析器来表达这些产生式的语法时,你会发现在第一个 <rel-op>
的位置存在一种移进-归约冲突(shift-reduce conflict)。解析需要向前查看任意数量的符号,以确定是否在其之前有第二个 <rel-op>
,才能决定是使用二元还是三元形式。在这种情况下,你不能简单地忽略该冲突,因为那将导致错误的解析。(<expr> <rel-op> <expr>) <rel-op> <expr>
,这将是你第三行代码的解析方式(因为Java中关系运算符是左结合的)。我没有看到你的例子如何证明你的观点。 - Eric Towers为什么这种语法根本没有定义呢?此外,x < y
的计算结果是布尔值,那么bool < int
是什么意思呢?这并不是额外的负担;此外,如果你真的想要 - isBetween(10,x,20)
- 你可以编写一个实用程序方法。虽然我自己不会这样做,但嘿……
isBetween()
方法的第一个参数应该是要测试的值,第二个和第三个参数应该是上限和下限。不要问我原因,这种方式只是更加合理。 - Joachim Sauerif(x.IsBetween(10,20)) {...}
;-p - Marc Gravellx.IsBetween(10)
是什么意思? - Joachim Sauer这只是语法问题。'<' 是一个二元操作符,大多数语言不会使其具有传递性。他们本可以像你说的那样设计它,但之后就会有人问为什么不能在三元操作符中使用其他操作呢?比如 "if (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 < 20
,键入10 < x && x < 20
的不便微不足道, 因此Java语言的设计师决定不支持它,以避免语言复杂度增加。
COBOL允许这样做(我相信其他一些语言也可以)。Java大部分语法是从不允许这样做的C语言继承而来的。
<
的情况,参数必须单调递增才能评估为t
。请参见http://www.lispworks.com/documentation/HyperSpec/Body/f_eq_sle.htm#LT。 - seh10 < x < 20
,因为所有操作都会产生“成功或失败”和一个值。 - Code-Apprentice10 < x < 20
语法。 - Code-Apprenticea = 10; b = 15; c = 20
public static boolean check(int a, int b, int c) {
return a<=b && b<=c;
}
这个代码检查 b 是否在 a 和 c 之间
Range.open(10, 20).contains(n)
Apache Commons Lang 也有类似的类。
由于<
运算符(以及大多数其他运算符)都是二元运算符(它们需要两个参数),而 (true true)
不是一个有效的布尔表达式。
Java 语言设计者本可以设计一种允许您所偏好的语法的语言,但他们决定不值得增加更复杂的解析规则(我猜测如此)。