【问题标题】:What is operator precedence of the *= operator in Java?Java中*=运算符的运算符优先级是什么?
【发布时间】:2017-10-13 16:41:17
【问题描述】:

这来自 Java 泛型和集合中的集合部分。下面举例说明如何计算String的hashcode:

    int hash = 0;
    String str = "The red fox jumped over the fence";
    /** calculate String Hashcode **/
    for ( char ch: str.toCharArray()){
//      hash *= 31 + ch; this evaluates to 0 ????
        hash = hash * 31 + ch;
    }
    p("hash for " + str + " is " + hash);

“红狐跳过栅栏”的哈希值为 1153233987386247098。 这似乎是正确的。但是,如果我使用速记符号 *= ,我会得到 0 为答案。

    int hash = 0;
    String str = "The red fox jumped over the fence";
    /** calculate String Hashcode **/
    for ( char ch: str.toCharArray()){
        hash *= 31 + ch;
//      hash = hash * 31 + ch;
    }
    p("hash for " + str + " is " + hash);

“红狐跳过栅栏”的哈希值为 0

所以我很好奇如何使用 *= 评估运算符优先级 运营商?

【问题讨论】:

标签: java operator-keyword operator-precedence


【解决方案1】:
hash *= 31 + ch;

相同
hash = hash * (31 + ch);

这解释了 0 结果,因为 hash 被初始化为 0 并且在每次乘法后保持为 0。

在计算 *= 运算符之前,先计算其两个操作数(hash31+ch)。只有这样它们才相乘,结果存储在hash 变量中。

为了得到同样的输出

hash = hash * 31 + ch;

使用*=,您将不得不中断操作:

hash *= 31;
hash += ch;

【讨论】:

  • 或者,因为首先使用*= 的最可能原因是减少打字,所以只需使用 hash = hash * 31 + ch :-)
  • @paxdiablo 这当然是真的 :)
  • 您的回答非常清晰和合乎逻辑。事实上,我认为是这样的。但是,我很好奇实施者(Java 设计师)实际上是正确的,还是他们的错误?
  • @GeorgeCurington 我相信如果它的行为方式符合您的预期,那会令人困惑,因为您希望一个复杂的赋值运算符执行两个赋值 - 首先分配乘法的结果,然后是加法。
  • 好吧,也许吧;这是我对此的最后评论。我的逻辑流程如下:
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 2012-12-13
  • 2011-10-25
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多