Java的一元加运算符有什么用途?

44

Java的一元加运算符似乎是从C语言通过C++传承而来的。

int result = +1;   

它似乎具有以下效果:

  • 如果操作数是包装器对象,则取消其封箱
  • 将其操作数提升为int,如果它还不是int或更广的类型
  • 稍微复杂化了包含大量连续加号的恶意表达式的解析

在我看来,有更好/更清晰的方法来完成所有这些事情。

这个SO问题中,涉及到C#中对应的运算符时,有人说:“如果您觉得需要,可以重载它。”

然而,在Java中,不能重载任何运算符。那么,这个一元正运算符在Java中存在,只是因为它在C ++中存在吗?


7
代码混淆竞赛... SCJP考试... - Pops
C语言也有类似的问题,因为它没有重载:https://dev59.com/j2w15IYBdhLWcg3wZq5r ,并且与Java类似,会进行类型提升。 - Ciro Santilli OurBigBook.com
7个回答

50

当操作数的类型为bytecharshort时,一元加操作符会自动将其转换为int。这被称为一元数值提升,它使你能够执行类似下面的操作:

char c = 'c';
int i = +c;

虽然它的用途有限,但它确实有一个目的。请参见规范,特别是第§15.15.3节和第§5.6.1节。


28
没错,但在这种情况下它是多余的。由于这是一种扩展转换,int i = c; 将会执行同样的操作。 - Syntactic
9
从整体上看,这并不一定是多余的,因为它传达了意图。一个人可以合理地想到 int i = c 的作者是否打算将 c 赋值给一个 int?还有其他的方法吗?当然有,但这是最简短的同时也表达了意图。 - John Feminella
15
好的观点。我想在实践中,如果我想传达意图,我更有可能使用int i = (int) c;,但使用+显然更短。 - Syntactic
12
@JohnFeminella所说的“传达意图”?我不太认同,因为读代码的其他人不会真正知道它为什么在那里。正如您可以从其他答案中看到的那样,似乎大多数人对一元数值提升都不了解。就个人而言,我始终认为这是一个无操作,并且仅出于纯粹的装饰原因而存在。如果您的意图是数值提升,则(int) c要清晰得多,因为它是一种广泛接受、被广泛采用的模式。尽管如此,感谢您教给我一些我不知道的东西。 - Nicu Stiurca
4
我同意(int) c更清晰明了。但我并没有说这是最清晰的转换方式,也没有说明它能传达意图;我只是说这是最短的方式。 :) - John Feminella
显示剩余4条评论

13

这是对单个加号对 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);        
}

运行该程序的输出结果为:

char: X
int: 88

它的工作原理:一元加或减会取消其操作数的包装,如果它是一个包装对象,则将其操作数提升为int(如果尚未是int或更宽的类型)。因此,正如我们所看到的,虽然对method的第一个调用将选择char重载(仅取消包装),但第二个调用将选择methodint版本。类型为Character的变量ch将作为一元加的结果传递给method作为int参数。


“程序”究竟是什么? - Sapphire_Brick

6

我不确定,但我怀疑这是为了与(显然必要的)一元减号运算符保持对称。


11
如果Java中没有一元加运算符,完全有可能我现在会坐在Stack Overflow上抱怨它... - Syntactic
@Syntactic 不太可能。如果没有一元加运算符,你可以使用 intValue() 方法代替。 - Sapphire_Brick

3

Java 的一个设计目标是让开发者(特指 C/C++)感到熟悉,因此在像这样的运算符方面,我相信他们必须有充分的理由来排除它,而不是需要它的好理由。


2

我猜它存在的原因是有时打出加号可以使事情更清晰。你可能想强调某个数字是正数,而不是负数。

此外,在世界某些地区,正温度往往总是以加号为前缀,这是一个真实的例子。


2

许多其他语言都有一元加号。包含它是惯例,不包含它则有点小气。在编译器中只需要几行代码。


-3

Java中的一元运算符有以下作用:

  • + 一元加法运算符;表示正数(但是数字没有这个也是正数)
  • - 一元减法运算符;取反表达式
  • ++ 自增运算符;将值增加1
  • -- 自减运算符;将值减少1
  • ! 逻辑补码运算符;反转布尔值的值

来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html


您提供的链接是误导性的。一元运算符 + 并不表示“正值”:+-1 等于 -1 - Sapphire_Brick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接