了解Java中的Maximal Munch?

时间:2015-09-26 18:19:22

标签: java javac

我知道Maximal Munch Rule并非Java具体,但我的问题仅涉及JavaJava compiler

我还阅读了一些相关的答案:

但我仍然无法完全掌握 Maximal Munch 及其应用的概念。

如下面的代码所示:

int i = 3;
int j = +i;
System.out.println(i); //3
System.out.println(j); //3

int j = +i;如何解释语句Java compiler及其工作原理?

另一个例子,int j = + +i;也有效,但我不确定如何。

我试图自己理解这个概念,但我无法理解。

我想知道这是如何运作的,它背后的概念以及Java compiler如何处理这些陈述。

3 个答案:

答案 0 :(得分:1)

加号可用作:

  • 1 + 2二进制数字加法运算符
  • "A" + "B"二进制字符串连接运算符
  • ++i一元增量运算符
  • +i一元正号运算符(不常见,-i一元否定符号运算符更常见)

由于正号码运算符实际上并没有任何东西,因此可以将其消除。

// All the same
int j = + +i;
int j = +i;
int j = i;
int j = +(+(i));
int j = +(i);

有关详细信息,请参阅此处:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html

答案 1 :(得分:0)

这是一元加运算符,表示正值。坦率地说,它毫无意义 - +ii相同。

答案 2 :(得分:0)

您可以从Java语言规范中查看this section on lexical translations

  

在每个步骤中使用尽可能长的翻译,即使结果最终没有形成正确的程序,而另一个词汇翻译也会。有一个例外:如果在类型上下文中发生词汇翻译(§4.11)并且输入流有两个或多个连续的>字符,后跟非>字符,然后每个>字符必须转换为数字的标记比较运算符>

     

输入字符a--b被标记化(§3.5)为a--b,这不是任何语法正确程序的一部分,甚至虽然标记化a--b可能是语法正确程序的一部分。

所以在你的情况下:

int j = +i;

被标记为:

  • int
  • j
  • =(作业运营商)
  • +(表示正值的一元加运算符)
  • i

int j = + +i;

被标记为:

  • int
  • =
  • j
  • +(表示正值的一元加运算符)
  • 另一个一元加运算符+
  • i

因此,这两个陈述与int j = i完全相同,因为所有+运算符都被解释为一元加号(无加法+或增量++)。