一加二加意外编译

dje*_*kyb 31 java operators

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

// the two is inc'd, so reduces symbolically to println(int int)
// which is a compile error
System.out.println(1 ++ 2);
Run Code Online (Sandbox Code Playgroud)

但这样做:

System.out.println(1 + + 2);   // returns three
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?不应该也不编译?

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

rya*_*uyu 66

Java将工作解释1 + + 2为1加上正2.请参阅一元运算符部分.

  • 有时不需要详细说明规范.有时,最好的答案是最简单的答案.:) (8认同)
  • 虽然没有其他正确答案那么详细,但是这个答案很快就能解析并理解. (7认同)

Sot*_*lis 41

从规范,词汇翻译

每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序而另一个词汇翻译也会如此.有一个例外:如果词汇翻译发生在类型上下文(§4.11)中,并且输入流有两个或多个连续的>字符后跟非>字符,则每个>字符必须转换为令牌以用于数值比较运算符>.

(也称为最大蒙克.)

++被解释为后缀增量运算符,不能应用于整数文字,因此编译错误.

1 + + 2
Run Code Online (Sandbox Code Playgroud)

每个字符分别解释.1是一个整数文字,+加法运算符,+一元加运算符,2是一个整数文字.整个表达相当于

1 + (+2)
Run Code Online (Sandbox Code Playgroud)

这更容易阅读.


fas*_*ava 6

在Java/C++/C ++中不一样+ +.++/ --递增/递减运算符.第一种情况不起作用,因为它不适用于文字(12).即便如此,它也不是一个有效的陈述,1++ 2也不1 ++2是Java中的有效陈述.第二个例子有效,因为它被解释为1 + (+2).Java词法分析器忽略了空格.以同样的方式这是有效的:

1 + + + 2   --> 1 + (+ (+2))
Run Code Online (Sandbox Code Playgroud)

要么

1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2
Run Code Online (Sandbox Code Playgroud)

它的工作原理只是因为+unary操作员.它不适用于字符串,如下所示:

"a" + + "b"   // does not work because +"b" is not valid.
Run Code Online (Sandbox Code Playgroud)

同样,它与乘法无效

1 * * 2       // does not work because *2 is not valid.
Run Code Online (Sandbox Code Playgroud)