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

时间:2014-06-18 07:12:13

标签: java

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

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

输出仍为10. + + 10的含义是什么?

8 个答案:

答案 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