【问题标题】:What is the purpose of Java's unary plus operator?Java的一元加号运算符的目的是什么?
【发布时间】:2010-04-12 18:32:40
【问题描述】:

Java 的一元加号运算符似乎是通过 C++ 从 C 中继承而来的。

int result = +1;   

它似乎有以下效果:

  • 如果它是包装对象,则将其操作数拆箱
  • 将其操作数提升为 int(如果它还不是 int 或更宽)
  • 包含大量连续加号的恶意表达式的解析稍微复杂

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

this SO question 中,关于 C# 中的对应运算符,有人说“如果你觉得需要,它就会被重载”。

然而,在 Java 中,不能重载 any 运算符。那么这个一元加号运算符是否存在于 Java 中只是因为它存在于 C++ 中?

【问题讨论】:

标签: java language-history unary-operator


【解决方案1】:

当其操作数的类型为bytecharshort 时,一元加号运算符会自动转换为int。这称为一元数字提升,它使您能够执行以下操作:

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

当然,它的用途有限。但它确实有一个目的。请参阅规范,特别是 §15.15.3§5.6.1 部分。

【讨论】:

  • 是的,但在这种情况下它是多余的。由于这是一个扩大的转换,int i = c; 将做同样的事情。
  • 从整体意义上来说不一定是多余的,因为它传达了意图。有人可能会对int i = c 感到好奇,“这段代码的作者是否打算将c 分配给int?”还有其他方法吗?当然可以,但这是传达意图的最短方式。
  • 好点。我认为在实践中,如果我想表达意图,我更有可能使用int i = (int) c;,但使用+ 肯定会更短。
  • @JohnFeminella “传达意图”?我真的不买它,因为其他阅读代码的人不会真正知道它为什么在那里。正如您从其他答案中看到的那样,似乎大多数人对一元数字提升一无所知。就个人而言,我一直认为这是一个无操作,它存在纯粹是出于美观的原因。如果数字提升是您的意图,那么(int) c 会更清晰,因为它是一种普遍存在且被广泛接受的模式。不过,+1 教了我一些我不知道的东西。
  • 我同意(int) c 更清晰。但我并没有说这是进行转换并传达意图的最清晰的方式;我说这是最短的。 :)
【解决方案2】:

以下是一元加号对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 重载(仅限拆箱),但第二次调用将选择int 版本的method。由于应用了一元加法Character 类型的变量ch 将作为int 参数传递到method

【讨论】:

  • 究竟什么是“程序”?
【解决方案3】:

我不知道,但我怀疑它与(显然必要的)一元减号运算符对称。

【讨论】:

  • 如果 Java 中没有一元加号运算符,我完全有可能坐在 Stack Overflow 上抱怨它......
  • @Syntactic 不太可能。如果没有一元加号运算符,则可以改用intValue() 方法。
【解决方案4】:

Java 的设计目标之一是熟悉(对于 C/C++ 开发人员),所以当涉及到这样的运算符时,我很确定他们必须有充分的理由将其排除在外,而不是充分的理由需要它。

【讨论】:

    【解决方案5】:

    我猜它就在那里,因为有时输入加号会使事情更清楚。您可能想强调某个数字是正数,而不是某个负数这一事实。

    此外,为了提供一个使用它的真实世界示例,在世界某些地区,正温度往往总是以加号为前缀。

    【讨论】:

      【解决方案6】:

      许多其他语言都有一元加号。习惯上将其包括在内,而将其排除在外。编译器中只有几行代码。

      【讨论】:

        【解决方案7】:

        一元运算符对 java 执行以下操作:

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

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

        【讨论】:

        • 您提供的链接具有误导性。一元 + 不“表示正值”:+-1 等于 -1
        猜你喜欢
        • 2011-10-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        相关资源
        最近更新 更多