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

cgvd09ve  于 2021-07-09  发布在  Java
关注(0)|答案(10)|浏览(402)

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

if(10 < x < 20)

相反,你必须

if(10<x && x<20)

好像有点过头了。

kupeojn6

kupeojn61#

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

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

当你试图用典型的pgs来表达那些结果的语法时,你会发现在第一个点上有一个shift-reduce冲突 <rel-op> . 解析需要向前看任意数量的符号,以查看是否有第二个符号 <rel-op> 在决定是否使用了二元或三元形式之前。在这种情况下,您不能简单地忽略冲突,因为这将导致不正确的解析。
我并不是说这种语法是致命的模棱两可。但我认为您需要一个回溯解析器来正确处理它。对于以快速编译为主要卖点的编程语言来说,这是一个严重的问题。

vql8enpb

vql8enpb2#

cobol允许这样做(我相信其他一些语言也可以)。java继承了c语言的大部分语法,而c语言不允许这样做。

k4aesqcs

k4aesqcs3#

因为语法没有定义?除此之外, x < y 评估为bool,那么 bool < int 什么意思?它不是一个真正的开销;另外,如果你真的想- isBetween(10,x,20) -我自己也不会,但是嘿。。。

gstyhher

gstyhher4#

你可以自己做

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

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

ldioqlga

ldioqlga5#

简化:

a = 10; b = 15; c = 20

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

检查b是否在a和c之间

dy2hfwbg

dy2hfwbg6#

因为 < 运算符(和大多数其他运算符)是二进制运算符(它们有两个参数),并且 (true true) 不是有效的布尔表达式。
java语言设计者本来可以设计这种语言来允许您喜欢的语法类型,但是(我猜)他们认为这样做不值得使用更复杂的解析规则。

sg24os4d

sg24os4d7#

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

oyt4ldly

oyt4ldly8#

你是人类,因此你明白“10<x<20”这个词的意思。计算机没有这种直觉,所以它把它读作:“(10<x)<20”。
例如,如果x=15,它将计算:
(10<x)=>真
“真<20”=>???
在c编程中,情况会更糟,因为没有真\假值。如果x=5,计算公式为:
10<x=>0(假值)
0<20=>非0数字(真)
因此“10<5<20”将返回真值!:s

iugsix8n

iugsix8n9#

只是语法问题是一个二进制操作,大多数语言都不使其可传递。他们本可以像你说的那样做,但后来有人会问你为什么不能用三元组做其他操作。”如果(12<x!=5)"?
语法总是在复杂性、表达性和可读性之间进行权衡。不同的语言设计师会做出不同的选择。例如,sql有“x在y和z之间”,其中x、y和z可以单独或全部是列、常量或绑定变量。我很高兴在sql中使用它,我也很高兴不用担心为什么它不在java中。

kb5ga3dv

kb5ga3dv10#

if (10 < x || x < 20) 对于10到20之间的数字,此语句的计算结果为真。这大致相当于 10 < x < 20

相关问题