我很好奇为什么这个简单的程序可以使用IntelliJ(Java 7)由java编译。
public class Main {
public static void main(String[] args)
{
int e = + + 10;
System.out.println(e);
}
}
输出仍为10. + + 10
的含义是什么?
答案 0 :(得分:60)
是the unary plus,两次。它不是前缀增量,因为有空格。 Java在很多情况下确实考虑了空格。
一元加上基本上什么也没做,它只是提升了操作数。
例如,这不会编译,因为一元加号导致byte
被提升为int
:
byte b = 0;
b = +b; // doesn't compile
答案 1 :(得分:34)
在这种情况下,Java将+
运算符视为一元运算符,因此结果为10
。只需尝试使用以下代码:
int e = + - 10; // result is -10
int e = - - 10; // result is 10
答案 2 :(得分:28)
+
'es是unary plus operator,表示其右侧的值的符号,而不是添加两个值时使用的addition operator。
考虑这一行
int e = + + + + + + + + 10;
等同于此
int e = +( +( +( +( +( +( +( +10)))))));
这又等同于
int e = +10;
与(<形式)相似
int e = -10;
这可能更容易理解。
顺便说一句,+ +
不是等价的,也不是由解析器评估为increment operator ++
!
答案 3 :(得分:21)
++
和+
都是运营商。它们是语言的元素。从技术上讲,它们可以称为令牌。 + +
不是Java中的单个标记,在编译的解析阶段会分解为两个单独的标记。
+
可以以两种形式存在:(i)作为一元运算符;例如+10
(这实际上是一个只会增加混乱的无操作)或(ii)作为二进制运算符(意味着它作用于两件事)来添加两个术语;例如10 + 10
。
由于它们具有内在价值,您还可以将10
和+10
视为表达式。您还应该注意,一元+
具有非常高的运算符优先级,因此它将紧跟在它之后的表达式上。
因此,代码中发生的事情是编译器将+
绑定到表达式10的左侧以生成另一个值为10的表达式。然后绑定第二个最左边的一元+
再生产,10。
总结:如果没有空格,++
是一个令牌。在它们之间有任何空格的情况下,两个+
充当两个一元运算符。
答案 4 :(得分:5)
不要混淆preincrement运算符++
和一元运算符+
重复两次。
int e = ++10; // won't compile "invalid argument to operation ++/--"
int e = + +10; //compile and e equals to 10
答案 5 :(得分:4)
这只是一元加号。如果编译int e = + + 10
,您将获得以下字节码:
bipush 10
istore_1
完全等同于int e = 10
答案 6 :(得分:3)
所以每个人都说它是一个一元加号,将其操作数提升为整数值。我注意到一些关于Java如何允许无用结构的评论。那么,其他语言也是如此,包括正式的数学。
这不是Java特定的事情。编译器编写者试图“预测”程序员可能在语法中编写的每个无用的东西,并试图通过在编译器中添加语义检查来限制它们,这是一项不可能完成的任务。另外,“无用”是一个主观用语。一个人的无用是另一个男人的学习工具。你把它留给程序员。如果他想编写无用的代码,那就这样吧。只要它生成正确的代码,我们就应该满意。
代码就像数学。它可能有用,或者没有用。但它只是是,就像数字42一样。根据上下文,它既无用也无用。它只有42岁。
我们不需要的是Java编译器中的任何额外语义代码来限制程序员。语言已经有足够的束缚了。
答案 7 :(得分:2)
10是文字而不是变量。因此,10不能递增。
++somevariable increments somevariable.
++variable -> increment operator.
+ + someliteral will just equate to someliteral.
+ + literal -> successive unary + operator