2017-12-04 3 views
-1

なぜ2つの関数が異なる結果をもたらすのか不思議です。この場合、h * = h * 101 + s [i]とh = h * 101 + s [i]が異なるのはなぜですか?

unsigned long Hash1(const string s) 
{ 

    int length = s.length(); 
    unsigned long h = 1; 

    for (int i = 0; i < length; i++) 
     h *= 101 + (unsigned long)s[i]; 

    return h; 
} 

unsigned long Hash2(const string s) 
{ 

    int length = s.length(); 
    unsigned long h = 1; 

    for (int i = 0; i < length; i++) 
     h = h * 101 + (unsigned long)s[i]; 

    return h; 
} 

int main() 
{ 
    cout << "Value of hash1 = " << Hash1("[email protected]") << endl; 
    cout << "Value of hash2 = " << Hash2("[email protected]") << endl; 

    system("pause"); 
    return 0; 
} 

h *= 101 + (unsigned long)s[i]to h = h * 101 + (unsigned long)s[i]等しいではないですか?

これが出力されます:HASH2の

HASH1の価値 = 1693843456

= 2162085645

はあなたの助けをありがとう!

+2

http://en.cppreference.com/w/cpp/language/operator_precedence – chris

+1

あなたは 'h * = 101'や' h = h * 101'を持っていません。あなたは 'h * = 101 +(unsigned long)s [i]'と 'h = h * 101 +(unsigned long)s [i]'を持っています。 – user2357112

+0

あなたは実際にそれを伝えています。 'h = h *(101 + s [i])' ..つまり、h =自体に右側の式全体が乗算されます。 – Brandon

答えて

2

h *= 101 + (unsigned long)s[i]h = h * 101 + (unsigned long)s[i]と同じではありませんか? operator precedenceによる

いいえ、h *= 101 + (unsigned long)s[i]h = h * (101 + (unsigned long)s[i])と同じであるh *= (101 + (unsigned long)s[i])、と等価です。

両者の違いは、コンピューティングとの間の差である:

h = h*(a+b) 

h = h*a + b 
+0

私は今理解しています。ありがとう! –

1

回答は、すでに質問へのコメントに記載されているが、ちょうど質問を拡張し、 2つの

h *= 101; 

h = h * 101; 

確かに同等です。しかし、より大きなの式の中で使用された場合、*=の優先順位は非常に低くなります。 *が最高の優先順位を持ち、次に+、次に*=です。

(h *= 101) += x; 

トンので働く:あなたはあなたが書かれている可能性が

h = (h * 101) + x; 
を望んでいたならば、今すぐ

h = h * (101 + x); 

:だから

h *= 101 + x; 

は同じであり、彼は *=オペレータは左側の参照を返します。しかし、これは本当に素晴らしいとは限りません。