Java-运算符顺序
为什么a=b+++c被解析为a=b++,+,c? 它可以是a=b,+,+c?lex tool是否遵循任何命令或规则Java-运算符顺序,java,operators,Java,Operators,为什么a=b+++c被解析为a=b++,+,c? 它可以是a=b,+,+c?lex tool是否遵循任何命令或规则 int a = 20, b = 10, c = 0; // a=b+++c is compiled as // b++ +c // a=b+c then b=b+1 a = b+++c; System.out.println("Value of a(b+c),b(b+1),c = " +
int a = 20, b = 10, c = 0;
// a=b+++c is compiled as
// b++ +c
// a=b+c then b=b+1
a = b+++c;
System.out.println("Value of a(b+c),b(b+1),c = " + a + "," + b + "," + c);
输出:
Value of a(b+c),b(b+1),c = 10,11,0
是的,lexer只是贪婪。当它找到一个新的+时,它的第一个任务是检查它是否可以用一个组成多字符运算符的字符来完成,例如++或+=
您可以通过++1和++1之间的差异看到它。一个是无效的,另一个虽然愚蠢,但却是有效的。当Java代码被标记化时,它将按照以下命令使用尽可能长的标记: 3.2. 词汇翻译 原始Unicode字符流使用以下三个词汇转换步骤转换为一系列标记,这三个步骤依次应用: 将原始Unicode字符流中的Unicode转义转换为相应的Unicode字符。格式为\uxxx的Unicode转义,其中xxxx是十六进制值,表示编码为xxxx的UTF-16代码单元。此翻译步骤允许任何程序仅使用ASCII字符表示 将步骤1产生的Unicode流转换为输入字符流和行终止符流 将步骤2产生的输入字符流和行结束符翻译成一系列输入元素,在丢弃空白和注释后,这些元素包括作为句法语法终端符号的标记 每一步都使用尽可能长的翻译,即使结果最终不能生成正确的程序,而另一个词汇翻译可能会生成正确的程序 因此,输入字符a-b被标记化§3.5为a,-,b,这不是任何语法正确程序的一部分,即使标记化a,-,-,b可能是语法正确程序的一部分 是的,在那里