Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中*=运算符的运算符优先级是多少?_Java_Operator Keyword_Operator Precedence - Fatal编程技术网

Java中*=运算符的运算符优先级是多少?

Java中*=运算符的运算符优先级是多少?,java,operator-keyword,operator-precedence,Java,Operator Keyword,Operator Precedence,这来自Java泛型和集合中关于集合的部分。以下示例说明如何计算字符串的哈希代码: 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 ???? ha

这来自Java泛型和集合中关于集合的部分。以下示例说明如何计算字符串的哈希代码:

    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

因此,我很好奇如何使用*= 接线员

hash *= 31 + ch;

hash = hash * (31 + ch);
这解释了0的结果,因为
散列
被初始化为0,并且在每次乘法后保持为0

在计算
*=
运算符之前,将计算其两个操作数(
hash
31+ch
)。只有当它们相乘时,结果才会存储在
散列
变量中

为了获得相同的输出

hash = hash * 31 + ch;
使用
*=
,您必须中断以下操作:

hash *= 31;
hash += ch;

hash = hash * (31 + ch);
这解释了0的结果,因为
散列
被初始化为0,并且在每次乘法后保持为0

在计算
*=
运算符之前,将计算其两个操作数(
hash
31+ch
)。只有当它们相乘时,结果才会存储在
散列
变量中

为了获得相同的输出

hash = hash * 31 + ch;
使用
*=
,您必须中断以下操作:

hash *= 31;
hash += ch;

. 这就是为什么它在乘法之前做加法,得到零。。这就是为什么它在乘法之前进行加法,得到零。或者,因为首先使用
*=
最可能的原因是为了减少键入,所以只需使用
hash=hash*31+ch
:-)@paxdiablo当然是这样:)您的答案非常清楚且符合逻辑。事实上,我认为情况就是这样。然而,我很好奇,实现者(java设计人员)是否真的正确,或者这是他们的一个错误?@geogecurington我相信,如果它的行为符合您的预期,就会令人困惑,因为您期望一个复数赋值运算符执行两个赋值-首先赋值乘法的结果,然后赋值加法的结果;这是我最后的评论。我的逻辑是这样的:或者,因为使用
*=
的最可能的原因是为了减少键入,所以只需使用
hash=hash*31+ch
:-)@paxdiablo当然是这样:)您的答案非常清楚且符合逻辑。事实上,我认为情况就是这样。然而,我很好奇,实现者(java设计人员)是否真的正确,或者这是他们的一个错误?@geogecurington我相信,如果它的行为符合您的预期,就会令人困惑,因为您期望一个复数赋值运算符执行两个赋值-首先赋值乘法的结果,然后赋值加法的结果;这是我最后的评论。我的逻辑如下: