检查int是否在两个数字之间

Tim*_*sen 30 java integer conditional-operator

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

if(10 < x < 20)
Run Code Online (Sandbox Code Playgroud)

而不是它,你将不得不这样做

if(10<x && x<20)
Run Code Online (Sandbox Code Playgroud)

这似乎有点开销.

Ste*_*n C 21

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

<expr> ::= <expr> <rel-op> <expr> |
           ... |
           <expr> <rel-op> <expr> <rel-op> <expr>
Run Code Online (Sandbox Code Playgroud)

当您尝试使用典型的PGS表达这些产品的语法时,您会发现在第一个时刻存在一个减少冲突的冲突<rel-op>.解析需要先查找任意数量的符号,以<rel-op>确定是否有一秒符号才能决定是否使用了二进制或三元形式.在这种情况下,您不能简单地忽略冲突,因为这会导致错误的解析.

我不是说这个语法是致命的歧义.但我认为你需要一个回溯解析器才能正确处理它.对于编程语言而言,这是一个严重的问题,快速编译是一个主要的卖点.

  • 并不是的.有关Python如何处理它,请参阅http://docs.python.org/reference/expressions.html#notin和http://docs.python.org/reference/grammar.html. (3认同)

Pau*_*lin 10

这只是语法.'<'是二进制操作,大多数语言都不会使其传递.他们本可以像你说的那样做,但是后来有人会问为什么你不能在trinary做其他的操作."if(12 <x!= 5)"?

语法总是在复杂性,表达性和可读性之间进行权衡.不同的语言设计师有不同的选择 例如,SQL具有"x BETWEEN y AND z",其中x,y和z可以单独或全部为列,常量或绑定变量.我很高兴在SQL中使用它,我也很高兴不要担心为什么它不在Java中.

  • 那太傻了.12 <x!= 5绝不是合理的特征请求,而10 <x <20绝对是.耶稣. (7认同)
  • 但是这样的构造可以在python中使用. (3认同)

Mar*_*ell 9

因为那个语法根本没有定义?此外,x < y评估为bool,那bool < int意味着什么?这不是真正的开销; 此外,你可以写一个实用工具方法,如果你真的想 - isBetween(10,x,20)- 我不会自己,但嘿......

  • 奇怪的是,我希望`isBetween()`方法的第一个参数是要测试的值,第二个和第三个参数是上限和下限.不要让我给你一个理由,这种方式感觉更加理智. (6认同)
  • 老实说,我不会因担心订单而感到兴奋.嘿,我主要是一个C#人,所以我可以添加一个扩展方法:`if(x.IsBetween(10,20)){...}`; -p (3认同)
  • @Cellfish:流体API都很好而有光泽,但是你把它放得太远了:`x.IsBetween(10)`是什么? (2认同)

Ice*_*eve 8

你可以做自己的

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

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


sta*_*lue 7

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


Tof*_*eer 6

COBOL允许(我相信其他一些语言也可以).Java从C继承了大部分语法,但不允许它.

  • 我很高兴我确实记得在COBOL(嗅) (3认同)