所以,我希望这不会编译,它不会:
// the two is inc'd, so reduces symbolically to println(int int)
// which is a compile error
System.out.println(1 ++ 2);
但这样做:
System.out.println(1 + + 2); // returns three
是什么给出的?它不应该也不编译吗?
此外,由于操作员,这个问题很难搜索。
答案 0 :(得分:66)
Java正在将工作1 + + 2
解释为1加上正2.请参阅Unary operator section。
答案 1 :(得分:41)
来自规范,Lexical Translations
每个步骤都使用尽可能长的翻译,即使是 结果并不能最终使另一个正确的程序 词汇翻译会。有一个例外:如果是词汇 转换发生在类型上下文(第4.11节)中,输入流具有 <连续两次>非&gt;后面跟着的字符 字符,然后每个&gt;必须将字符转换为令牌 数值比较运算符&gt;。
(也称为maximal munch。)
++
被解释为postfix increment operator,不能应用于整数文字,因此编译错误。
虽然
1 + + 2
每个字符分别解释。 1
是整数文字,+
是additive operator,+
是unary plus operator,2
是整数文字。整个表达式相当于
1 + (+2)
更容易阅读。
答案 2 :(得分:6)
在Java / C ++ / C中++
与+ +
不同。 ++
/ --
是Increment/Decrement operator。
第一种情况不起作用,因为它不适用于文字(1
或2
)。
即使这样,它也不是一个有效的语句,1++ 2
和1 ++2
都不是Java中的有效语句。第二个示例有效,因为它被解释为1 + (+2)
。 Java词法分析器忽略了空格。以同样的方式有效:
1 + + + 2 --> 1 + (+ (+2))
或者
1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2
只有+
是unary
运算符才有效。它不适用于字符串,如下所示:
"a" + + "b" // does not work because +"b" is not valid.
同样,它对乘法
无效1 * * 2 // does not work because *2 is not valid.
答案 3 :(得分:3)
消息是:
Main.java:14: error: ')' expected
System.out.println(1 ++ 2);
^
1 ++ 2
语句被解析为1
,后跟++
,后跟2
。这被解释为1++
和2
创建语法错误(而不是unexpected type
错误;实际上,如果您使用变量,例如i ++ j
,则会得到相同的错误
另一方面,1 + + 2
语句被解析为1
,后跟+
,后跟+2
,按预期编译。两个运营商之间的空间将两个运营商分开。
答案 4 :(得分:3)
有时使用变量更容易看到问题。
您的代码段可以改写为:
int a = 1;
int b = +2;
System.out.println(a + b);
现在,您可以轻松地看到第二个+
运算符用于指示正值。
你也可以写+1 + +2
。
-
运算符可用于否定表达式。
+
和-
是一元运营商。