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中所说的,每一步都使用尽可能长的翻译。不,但语言规范是描述语言的权威来源