我很好奇为什么这个简单的程序可以使用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)
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.
总结:没有空间,++是一个单一的标记.它们之间有任何空间,两者+作为两个一元运算符.
这只是一元加。如果编译int e = + + 10你将得到以下字节码:
bipush 10
istore_1
Run Code Online (Sandbox Code Playgroud)
这完全相当于int e = 10
不要混淆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)