Java间距:赋值时出错
我正在学习Java的深层基础知识。我有一个疑问 示例代码:Java间距:赋值时出错,java,syntax,Java,Syntax,我正在学习Java的深层基础知识。我有一个疑问 示例代码: public static void main(String arg) { int i=1++1; /* this is not working*/ int i=1+ +1; /* this is working*/ } 请解释发生了什么…以下是解释: int i=1++1; /* this is not working*/ 这不起作用,因为解析器将++解释为表示递增运算符,而您不能将其应用于常量。它必须应用于
public static void main(String arg)
{
int i=1++1; /* this is not working*/
int i=1+ +1; /* this is working*/
}
请解释发生了什么…以下是解释:
int i=1++1; /* this is not working*/
这不起作用,因为解析器将++
解释为表示递增运算符,而您不能将其应用于常量。它必须应用于整型或长型变量
我建议你更仔细地阅读
int i=1+ +1; /* this is working*/
这是因为解析器将其解释为“add+1 to 1”,即2
无论哪种情况,这些都是难以阅读和解释的代码的示例。你应该学习一种有适当间距的清晰风格,并坚持下去 在编译过程中,Java源代码(unicode翻译后)将进行词汇翻译,如中所述。词法翻译用于将程序分成所谓的“输入元素”序列。因此,
inti=1++1代码>行被拆分为以下元素:
int
:令牌/关键字
:空白
i
:令牌/标识符
1
:标记/文字
++
:令牌/运算符
1
:标记/文字
代码>:标记/分隔符
此时,编译器对这些标记的含义知之甚少。但是,它不能将++
运算符拆分为两个单独的运算符,如中所述:
在每一步中都会使用尽可能长的翻译,即使结果最终不能生成正确的程序,而另一个词汇翻译会生成正确的程序
因此,输入字符a--b
被标记化(§3.5)为a
,--
,b
,这不是任何语法正确程序的一部分,即使标记化a
,-
,-
,b
可能是语法正确程序的一部分
我的
它还记录在可能使用空格来分隔令牌中:
空白(§3.6)和注释(§3.7)可用于分离标记,如果相邻,则可能以另一种方式标记。例如,输入中的ASCII字符-
和=
只有在没有中间空白或注释的情况下才能形成操作员令牌-=
(§3.12)
这解释了为什么1++1
以不同的方式解释。您还可以在第一种情况下使用注释:1+/**/+1
:
int i=1++1;/*这不起作用*/
- 1被解释为一个数字
- ++被解释为一元增量运算符
- 1被解释为一个数字
因此,在编译时会出现如下错误:
Multiple markers at this line
- Invalid argument to operation ++/--
- The left-hand side of an assignment must be a variable
- Syntax error on token "++", invalid AssignmentOperator
在第二种情况下:
int i=1++1;/*这是有效的*/
+和+之间的空格决定了不同的标记化
- 1被解释为一个数字
- +被解释为加法运算符
- +被解释为加法运算符
- 1被解释为一个数字
请参见1++1语法不正确。第二个例子是1+(+1)=2++
是一个递增运算符,所以第一行可能被计算为int i=(1++)1问题是解析器为什么这样做。JLS中有没有记录解析是这样的?感谢您的详细回答!:)@PrakashBala如果回答您的问题,请接受这个答案。正如我已经指出的,++运算符不能应用于r值。文档中描述得很好。@TagirValeev是的,是的。