我很好奇为什么这两个函数会产生不同的结果。
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("kelvin@gmail.com") << endl;
cout << "Value of hash2 = " << Hash2("kelvin@gmail.com") << endl;
system("pause");
return 0;
}
h *= 101 + (unsigned long)s[i]
是否等于to h = h * 101 + (unsigned long)s[i]
?
这是输出:
hash1的值 = 1693843456
hash2的值 = 2162085645
感谢您的帮助!!!
答案 0 :(得分:2)
不是
h *= 101 + (unsigned long)s[i]
等于h = h * 101 + (unsigned long)s[i]
?
不,由于operator precedence,h *= 101 + (unsigned long)s[i]
相当于h *= (101 + (unsigned long)s[i])
,与h = h * (101 + (unsigned long)s[i])
相同。
两者之间的差异是计算之间的差异:
h = h*(a+b)
和
h = h*a + b
答案 1 :(得分:1)
答案已在问题的评论中给出,但只是为了扩展问题,两个陈述
h *= 101;
h = h * 101;
确实等同。但是当在较大的表达式中使用时,*=
具有非常低的优先级。 *
具有最高优先级,然后是+
,然后是*=
。所以
h *= 101 + x;
与:
相同h = h * (101 + x);
现在,如果你想要
h = (h * 101) + x;
你可以写下:
(h *= 101) += x;
这是有效的,因为*=
运算符返回对左侧的引用。但是,这看起来并不是很好。