Java间距:在分配值时获取错误

时间:2015-08-20 10:17:09

标签: java syntax

我正在学习Java深度基础知识。我有一个疑问。

示例代码:

public static void main(String arg)
{

    int i=1++1; /* this is not working*/

    int i=1+ +1; /* this is working*/

}

请解释发生了什么......

3 个答案:

答案 0 :(得分:2)

以下是解释:

int i=1++1; /* this is not working*/

这不起作用,因为解析器将++解释为增量运算符,并且您无法将其应用于常量。它必须应用于整数或长整型变量。

我建议您仔细阅读Java operators

int i=1+ +1; /* this is working*/

这是有效的,因为解析器将此解释为“将+1添加到1'”,即2。

在任何一种情况下,这些都是难以阅读和解释代码的例子。你应该学会一个有适当间距的清晰风格并坚持下去。

答案 1 :(得分:2)

在编译期间,Java源代码(在unicode转换之后)经历了Java Language Specification, chapter 3中描述的词汇翻译。词法翻译用于将程序拆分为所谓的“输入元素”序列。因此int i=1++1;行被拆分为以下元素:

  • int:token / keyword
  • <space>:空白
  • i:token / identifier
  • 1:token / literal
  • ++:token / operator
  • 1:token / literal
  • ;:令牌/分隔符

此时编译器对这些令牌的含义知之甚少。但是,它不能将++运算符拆分为两个单独的运算符,因为它在JLS 3.2中有记录:

  

每一步都使用尽可能长的翻译,即使结果最终没有制作出正确的节目,而另一个词汇翻译也是如此。

     

因此,输入字符a--b被标记化(§3.5)为a--b,这不是任何语法正确程序的一部分,即使标记化a--b可以是语法正确程序的一部分。

强调我的。

还在JLS 3.5中记录了空格分隔标记的可能用法:

  

空格(第3.6节)和注释(第3.7节)可用于分隔令牌,如果相邻,则可能以其他方式对其进行标记。例如,只有在没有插入空格或注释的情况下,输入中的ASCII字符-=才能形成运算符标记-=(第3.12节)。

这解释了为什么1+ +1以不同的方式解释。您还可以使用评论:1+/**/+1

答案 2 :(得分: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 被解释为数字

请参阅Java tutorial operators chapter