我正在学习Java深度基础知识。我有一个疑问。
示例代码:
public static void main(String arg)
{
int i=1++1; /* this is not working*/
int i=1+ +1; /* this is working*/
}
请解释发生了什么......
答案 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; / *这不起作用* /
所以你在编译时遇到这样的错误:
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; / *这是有用的* /