为什么此djb2实现循环终止?

时间:2019-04-08 07:58:03

标签: c

一个字符串以一个空字节结尾。由于int大于char,因此int如何变为0并始终终止循环?

源:http://www.cse.yorku.ca/~oz/hash.html

unsigned long
hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

2 个答案:

答案 0 :(得分:3)

从较小类型加载整数不会保留较小类型没有的位;它们将被清除(或对于带符号的类型,通过符号扩展名设置)。

所以:

int x = 0xfeefd00d;
x = (char) 1;

1的值x保留为0xfeedf001 + CustomIDs +

答案 1 :(得分:1)

当一个表达式中的变量与不同类型的变量一起使用时(例如循环条件中的赋值),将生成implicit conversion。转换仅在类型之间进行转换,但如果可能,保留该值。

因此,当您在str中到达空终止符时,它会(实际上是promoted)转换为int,并保持值0。并且0始终为“ false”,从而结束循环。