JAVA算术运算。标记化。怎么用?
谁能解释或提供一个很好的参考来理解这个例子:JAVA算术运算。标记化。怎么用?,java,tokenize,Java,Tokenize,谁能解释或提供一个很好的参考来理解这个例子: int a=1; int b=2; System.out.println(a---b); //correct System.out.println(a- -b); //correct System.out.println(a--b); //wrong 谢谢。表达式a--b不是(如您所料)解析为a-(-b)),而是解析为(a--)-b 这个例子说明了这一点: int a = 0; int b = 0; System.out.println(a---b
int a=1;
int b=2;
System.out.println(a---b); //correct
System.out.println(a- -b); //correct
System.out.println(a--b); //wrong
谢谢。表达式a--b
不是(如您所料)解析为a-(-b))
,而是解析为(a--)-b
这个例子说明了这一点:
int a = 0;
int b = 0;
System.out.println(a---b); // prints 0
System.out.println(a); // prints -1
考虑到这种行为,a--b
被解析为(a--)b
,这显然是一个错误
当你在负数之间加一个空格时,a--b
它不再被解析为--
操作符,而是作为二进制和一元减号:a-(-b)
请注意,您可以编写a----b
,它被解释为a-(-b))
那么为什么会这样解释呢?@EJP对另一个答案给出了极好的评论。在中,您可以阅读以下内容:
每一步都使用尽可能长的翻译,即使结果最终不能生成正确的程序,而另一个词汇翻译可能会生成正确的程序。因此,输入字符a--b
被标记化(§3.5)为a
,--
,b
,这不是任何语法正确程序的一部分,即使标记化a
,-
,-
,b
可能是语法正确程序的一部分
-
和-
是一元运算符。因此不能与两个操作数一起使用。这就是为什么
System.out.println(a--b);
这是错误的
--
应用于a
,因此a
的新值为0
。如果您再添加一个-
,则a
的值减去1
后的值将被b
的值减去,从而产生-2
,这不仅仅是标记化。您还需要理解解析。这是正确的参考。任何程序员都应该能够找到自己的语言规范。@EJP,你能告诉我如何在JLS中找到OPs问题的答案吗?我试过了,但失败了。具体地说,我在寻找a--b
被解释为a--b
而不是a--b
或a--b
的原因,好的。这种联系更好。但是请告诉我为什么a--b
被解析为Identifier(a)、postfix(-)、PrefixOp(-)、Identifier(b)
而不是Identifier(a)、InfixOp(-)、PrefixOp(-)、Identifier(b)
。根据那一页的语法,这两种语言看起来都不错。因为正如#3.2中所说的,每一步都使用尽可能长的翻译。不,但语言规范是描述语言的权威来源