C for-loop是否在遇到'\ 0'字符时退出?

时间:2014-12-12 07:34:25

标签: c hash

我正在经历一个哈希函数并遇到一个条件,当一个'\ 0'(NIL)字符出现时,for循环
应该退出。

unsigned int hash_string (const char *s)
{
    register unsigned int i;

    for (i = 0; *s; s++) { // This for loop is supposed to end
                           // when a '\0' comes?
        i *= 16777619;
        i ^= *s;
    }

    return i;
}

据我所知,如果条件返回0 ,C-Loop应该结束
然而,在这里,没有这样的条件,它仍然有效吗?

有人还能说出循环成功/失败的所有条件吗?

3 个答案:

答案 0 :(得分:2)

null字符的值为0,因此在您的示例中,如果*s对应于字符串的空终止,则'\0'将计算为零。

来自 5.2.1字符集

  

...所有位都设置为0的字节,称为空字符   存在于基本执行字符集中;它用于终止一个   字符串。

然后在 6.4.4.4字符常量

  

12示例1构造{{1}}通常用于表示。{1}}   空字符。

答案 1 :(得分:1)

*s取消引用s指向的字符。

如果字符代码为0,则循环中断并传递除0以外的所有值。

\0保证为0,这就是为什么保证循环在遇到NUL字符时终止于字符串结尾。

\0中选择C作为字符串终止的原因之一是使这样的结构成为可能。

答案 2 :(得分:1)

*s评估为0false时,它们可以相互转换,循环结束。

实际上,字符\0的整数表示形式为0。所以它是一样的。