为什么这个带有"+ +"的Java代码会编译?

Gle*_*enn 31 java

我很好奇为什么这个简单的程序可以使用IntelliJ(Java 7)由java编译.

public class Main {
    public static void main(String[] args)
    {
        int e = + + 10;
        System.out.println(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出仍然是10.这是什么意思+ + 10

Rad*_*def 60

这是一元加,两次.它不是前缀增量,因为有空格.Java确实在许多情况下考虑空白.

一元加上基本上什么都不做,它只是提升了操作数.

例如,这不会编译,因为一元加号导致将byte其提升为int:

byte b = 0;
b = +b; // doesn't compile
Run Code Online (Sandbox Code Playgroud)

  • @Ryan` ++`显然不等同于`+ +`."没错"并不意味着"有用".此外,在数学中,没有人使用一元"+"和数字,只是在定义限制时"x从正面接近X"的简写符号.(例如,`x→+ 0`)因为冗余在数学中也不酷.但Java程序员喜欢冗余...... (6认同)

HJK*_*HJK 34

在这种情况下,Java将+运算符视为一元运算符,因此结果是10.只需尝试使用以下代码:

int e = + - 10; // result is -10
int e = - - 10; // result is 10
Run Code Online (Sandbox Code Playgroud)


And*_*rup 28

+"ES是一元加上操作者,表明该值的符号,以它的右侧,而不是加法运算符用于添加两个值时.

考虑这一行

int e = + + + + + + + + 10;
Run Code Online (Sandbox Code Playgroud)

这相当于此

int e = +( +( +( +( +( +( +( +10)))))));
Run Code Online (Sandbox Code Playgroud)

这再次相当于此

int e = +10;
Run Code Online (Sandbox Code Playgroud)

和(形式)相似

int e = -10;
Run Code Online (Sandbox Code Playgroud)

这可能更容易理解.

顺便说一句,+ +它不是等价的,也不是由解析器评估为增量运算符++!


Bat*_*eba 21

++并且+都是运营商.它们是语言的元素.从技术上讲,它们可以称为令牌. + +在Java中,它不是单个标记,在编译的解析阶段会分解为两个单独的标记.

+可以以两种形式存在:(i)作为一元运算符; 例如+10(这实际上是一个只会增加混淆的无操作)或(ii)作为二元运算符(意​​味着它作用于两件事)来添加两个术语; 例如10 + 10.

由于它们具有内在价值,因此您也可以将10+10视为表达式.您还应该注意,一元+具有非常高的运算符优先级,因此它将紧跟在它之后的表达式上.

因此,代码中发生的事情是编译器正在绑定+表达式10的左侧,以生成另一个值为10的表达式.然后,将第二个最左边的一元数据绑定+,再生成10.

总结:没有空间,++是一个单一的标记.它们之间有任何空间,两者+作为两个一元运算符.


man*_*uti 5

这只是一元加。如果编译int e = + + 10你将得到以下字节码:

bipush 10
istore_1
Run Code Online (Sandbox Code Playgroud)

这完全相当于int e = 10


flu*_*nis 5

不要混淆preincrement运算符++和一元运算符+重复两次.

int e = ++10; // won't compile "invalid argument to operation ++/--"
int e = + +10; //compile and e equals to 10
Run Code Online (Sandbox Code Playgroud)