一加二加意外编译

时间:2014-12-23 17:34:56

标签: java operators

所以,我希望这不会编译,它不会:

// 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

是什么给出的?它不应该也不编译吗?

此外,由于操作员,这个问题很难搜索。

5 个答案:

答案 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 operator2是整数文字。整个表达式相当于

1 + (+2)

更容易阅读。

答案 2 :(得分:6)

在Java / C ++ / C中+++ +不同。 ++ / --Increment/Decrement operator。 第一种情况不起作用,因为它不适用于文字(12)。 即使这样,它也不是一个有效的语句,1++ 21 ++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

-运算符可用于否定表达式。

+-是一元运营商。