检查int是否在两个数字之间
如果你试图找出int是否在数字之间,为什么不能这样做:
if(10 < x < 20)
而不是它,你将不得不这样做
if(10<x && x<20)
这似乎有点开销。
一个问题是三元关系结构会引入严重的解析器问题:
::= | ... |
当您尝试使用典型的PGS表达使用这些作品的语法时,您会发现在第一个
点处存在shift-reduce冲突。 解析器需要预先查找任意数量的符号,以查看是否存在第二个
然后才能决定是否使用了二进制或三元forms。 在这种情况下,您不能简单地忽略冲突,因为这会导致不正确的分析。
我不是说这个语法是致命的歧义。 但我认为你需要一个回溯解析器才能正确处理它。 对于编程语言来说,这是一个严重的问题,快速编译是一个主要的卖点。
因为那个语法根本没有定义? 此外, x < y
评估为bool,那么bool < int
是什么意思? 这不是真正的开销; 此外,你可以写一个实用工具方法,如果你真的想 - isBetween(10,x,20)
- 我不会自己 ,但嘿......
这只是语法。 ‘<'是二进制操作,大多数语言都不会使其传递。 他们本可以像你说的那样做,但是有人会问你为什么不能在trinary中做其他的操作。 “if(12 语法总是在复杂性,表达性和可读性之间进行权衡。 不同的语言设计师有不同的选择 例如,SQL具有“x BETWEEN y AND z”,其中x,y和z可以单独或全部为列,常量或绑定变量。 我很高兴在SQL中使用它,我也很高兴不要担心为什么它不在Java中。
如果允许10 < x < 20
,则输入10 < x && 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从Cinheritance了大部分语法,但不允许它。
你是人,因此你理解“10 例如,如果x = 15,它将计算: (10 “TRUE <20”=> ??? 在C编程中,它会更糟,因为没有True \ False值。 如果x = 5,则计算结果为: 10 0 <20 =>非0数(真) 因此“10 <5 <20”将返回True! :S
因为<
operator(和大多数其他)是二元运算符(它们有两个参数),而且(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)
对于10到20之间的数字,该陈述将评估为真。这相当于10 < x < 20