2017-05-15 19 views
1

これは、Javaジェネリックスとコレクションのセットに関するセクションから来ています。次の例は、文字列のハッシュコードを計算する方法を説明するために与えられますため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. です。しかし、省略表記* =を使用すると、答えは になります。

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だから、私は* = 演算子を使用して評価する方法をオペレータの優先順位についての好奇心である「赤いキツネはフェンスを飛び越えましたか」?

+1

[ '* ='の優先順位(および他のすべての割り当てを演算子)は '='](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)と同じです。それが乗算の前に加算を行い、ゼロになる理由です。 –

+0

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html –

答えて

8
hash *= 31 + ch; 

hashを0に初期化され、各乗算の後に0のままであるので、0の結果を説明している

hash = hash * (31 + ch); 

と同じです。

*=演算子が評価される前に、その2つのオペランド(hashおよび31+ch)が評価されます。それだけが乗算され、結果はhash変数に格納されます。

*=を使用して
hash = hash * 31 + ch; 

の同じ出力を得るために、あなたは操作を中断する必要があります:

hash *= 31; 
hash += ch; 
+0

または、最初に '* = 'を使用する最も一般的な理由は、入力を減らすことでしたので、* use *' hash = hash * 31 + ch' :-) – paxdiablo

+0

@paxdiabloそれは確かに真です:) – Eran

+0

あなたの答えは非常に明確で論理的です。実際、私はそれが事実であると仮定しました。しかし、私は実際には、Implementers(Javaデザイナー)の側で正しいか、これは彼らの間違いでしたか? –

関連する問題