Java的一元加运算符的目的是什么?

Syn*_*tic 36 java unary-operator language-history

Java的一元加运算符似乎来自C,通过C++.

int result = +1;   
Run Code Online (Sandbox Code Playgroud)

它似乎有以下影响:

  • 如果它是包装器对象,则将其操作数取消装箱
  • int如果它不是已经int或更宽,则提升其操作数
  • 稍微复杂化包含大量连续加号的邪恶表达式的解析

在我看来,有更好/更清晰的方法来做所有这些事情.

这个SO问题中,关于C#中的对应运算符,有人说"如果你觉得有必要,它就会超载".

但是,在Java中,不能超载任何运算符.那么这个一元加运算符是否只存在于Java中,因为它存在于C++中?

Joh*_*lla 41

一元加号运算符执行一个自动转换到int时它的操作数的类型是byte,char,或short.这称为一元数字促销,它使您可以执行以下操作:

char c = 'c';
int i = +c;
Run Code Online (Sandbox Code Playgroud)

当然,它的用途有限.但它确实有目的.请参阅规范,特别是第15.15.3节和第5.5.1 .

  • 是的,但在这种情况下它是多余的.由于这是一个扩大的转换,`int i = c;`将做同样的事情. (20认同)
  • 好点子.我认为在实践中我更有可能做`int i =(int)c;`如果我想传达意图,但使用`+`当然更短. (10认同)
  • @JohnFeminella"传达意图"?我真的不买,因为其他人阅读代码时并不知道为什么会这样.从其他答案中可以看出,似乎大多数人都不知道_unary numeric promotion_.就我个人而言,我一直认为这是一种无操作,它纯粹是出于美观的原因.如果数字促销是你的意图,那么`(int)c`更清晰,因为它是一种无处不在的,被广泛接受的模式.仍然,+1教我一些我不知道的东西. (9认同)
  • 从整体意义上说,它不一定是多余的,因为它传达了意图.有人可能合理地想知道`int i = c`,"这段代码的作者是否意味着将`c`分配给`int`?" 还有其他方法吗?当然,但这也是传达意图的最短路. (6认同)
  • 我同意`(int)c`更清楚.但我并没有说这是进行转换的最佳方式,也是表达意图; 我说这是_shortest_.:) (2认同)

Pet*_*háč 8

以下是一元加号对Character变量的简短演示:

private static void method(int i){
    System.out.println("int: " + i);
}

private static void method(char c){
    System.out.println("char: " + c);
}

public static void main(String[] args) {
    Character ch = 'X';
    method(ch);
    method(+ch);        
}
Run Code Online (Sandbox Code Playgroud)

运行该程序的输出是:

char: X
int: 88
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:一元+或 - 取消它们的操作数,如果它是一个包装器对象,那么将它们的操作数提升为int,如果不是int或更宽的话.所以,正如我们所看到的,虽然第一次调用method将选择char重载(仅取消装箱),第二次调用将选择int版本method.由于应用了一元加号,因此变量ch类型Charactermethod作为int参数传递.


Car*_*ter 7

我不知道,但我怀疑它与(显然是必要的)一元减运算符的对称性存在.

  • 完全可能的是,如果Java中没有一元加运算符,我会坐在Stack Overflow上抱怨它... (9认同)