Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java间距:赋值时出错_Java_Syntax - Fatal编程技术网

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*/ 这不起作用,因为解析器将++解释为表示递增运算符,而您不能将其应用于常量。它必须应用于

我正在学习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*/
这不起作用,因为解析器将
++
解释为表示递增运算符,而您不能将其应用于常量。它必须应用于整型或长型变量

我建议你更仔细地阅读

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是的,是的。