如果你想找出一个int是否在到个数之间,为什么不能这样做:
if(10 < x < 20)
相反,你必须
if(10<x && x<20)
好像有点过头了。
kupeojn61#
一个问题是三元关系构造会带来严重的解析器问题:
<expr> ::= <expr> <rel-op> <expr> | ... | <expr> <rel-op> <expr> <rel-op> <expr>
当你试图用典型的pgs来表达那些结果的语法时,你会发现在第一个点上有一个shift-reduce冲突 <rel-op> . 解析需要向前看任意数量的符号,以查看是否有第二个符号 <rel-op> 在决定是否使用了二元或三元形式之前。在这种情况下,您不能简单地忽略冲突,因为这将导致不正确的解析。我并不是说这种语法是致命的模棱两可。但我认为您需要一个回溯解析器来正确处理它。对于以快速编译为主要卖点的编程语言来说,这是一个严重的问题。
<rel-op>
vql8enpb2#
cobol允许这样做(我相信其他一些语言也可以)。java继承了c语言的大部分语法,而c语言不允许这样做。
k4aesqcs3#
因为语法没有定义?除此之外, x < y 评估为bool,那么 bool < int 什么意思?它不是一个真正的开销;另外,如果你真的想- isBetween(10,x,20) -我自己也不会,但是嘿。。。
x < y
bool < int
isBetween(10,x,20)
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之间
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之间
dy2hfwbg6#
因为 < 运算符(和大多数其他运算符)是二进制运算符(它们有两个参数),并且 (true true) 不是有效的布尔表达式。java语言设计者本来可以设计这种语言来允许您喜欢的语法类型,但是(我猜)他们认为这样做不值得使用更复杂的解析规则。
<
(true true)
sg24os4d7#
打字的不便 10 < x && x < 20 如果允许的话,与语言复杂性的增加相比是最小的 10 < x < 20 ,因此java语言的设计者决定不支持它。
10 < x && x < 20
10 < x < 20
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
iugsix8n9#
只是语法问题是一个二进制操作,大多数语言都不使其可传递。他们本可以像你说的那样做,但后来有人会问你为什么不能用三元组做其他操作。”如果(12<x!=5)"?语法总是在复杂性、表达性和可读性之间进行权衡。不同的语言设计师会做出不同的选择。例如,sql有“x在y和z之间”,其中x、y和z可以单独或全部是列、常量或绑定变量。我很高兴在sql中使用它,我也很高兴不用担心为什么它不在java中。
kb5ga3dv10#
if (10 < x || x < 20) 对于10到20之间的数字,此语句的计算结果为真。这大致相当于 10 < x < 20
if (10 < x || x < 20)
10条答案
按热度按时间kupeojn61#
一个问题是三元关系构造会带来严重的解析器问题:
当你试图用典型的pgs来表达那些结果的语法时,你会发现在第一个点上有一个shift-reduce冲突
<rel-op>
. 解析需要向前看任意数量的符号,以查看是否有第二个符号<rel-op>
在决定是否使用了二元或三元形式之前。在这种情况下,您不能简单地忽略冲突,因为这将导致不正确的解析。我并不是说这种语法是致命的模棱两可。但我认为您需要一个回溯解析器来正确处理它。对于以快速编译为主要卖点的编程语言来说,这是一个严重的问题。
vql8enpb2#
cobol允许这样做(我相信其他一些语言也可以)。java继承了c语言的大部分语法,而c语言不允许这样做。
k4aesqcs3#
因为语法没有定义?除此之外,
x < y
评估为bool,那么bool < int
什么意思?它不是一个真正的开销;另外,如果你真的想-isBetween(10,x,20)
-我自己也不会,但是嘿。。。gstyhher4#
你可以自己做
编辑:抱歉,检查c是否在a和b之间
ldioqlga5#
简化:
检查b是否在a和c之间
dy2hfwbg6#
因为
<
运算符(和大多数其他运算符)是二进制运算符(它们有两个参数),并且(true true)
不是有效的布尔表达式。java语言设计者本来可以设计这种语言来允许您喜欢的语法类型,但是(我猜)他们认为这样做不值得使用更复杂的解析规则。
sg24os4d7#
打字的不便
10 < x && x < 20
如果允许的话,与语言复杂性的增加相比是最小的10 < x < 20
,因此java语言的设计者决定不支持它。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
iugsix8n9#
只是语法问题是一个二进制操作,大多数语言都不使其可传递。他们本可以像你说的那样做,但后来有人会问你为什么不能用三元组做其他操作。”如果(12<x!=5)"?
语法总是在复杂性、表达性和可读性之间进行权衡。不同的语言设计师会做出不同的选择。例如,sql有“x在y和z之间”,其中x、y和z可以单独或全部是列、常量或绑定变量。我很高兴在sql中使用它,我也很高兴不用担心为什么它不在java中。
kb5ga3dv10#
if (10 < x || x < 20)
对于10到20之间的数字,此语句的计算结果为真。这大致相当于10 < x < 20