从this回答,我看到了这个:
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;
}
问题在于我不知道如何停止执行。一般来说,作业不是真的吗?我的意思是if(a = 5)
将是真的。
编译器也给了我这个警告:
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
任何人都可以告诉我关于循环的具体内容吗?我强烈建议一个例子是最好的方法。
括号还应该在哪里更明确?
答案 0 :(得分:5)
赋值的值是指定的值。例如,此代码:
int a;
printf("%d\n", a=5);
...将打印出5
。
因此,此循环一直运行,直到c
被赋予错误。
在C中,0
为false,字符串以空值终止,因此在字符串的末尾,NUL字符0
将结束循环。
警告是因为if (a = 5)
是if (a == 5)
的拼写错误,而不是它的故意代码。在if ((a == 5))
之类的作业中添加额外的括号是一种惯用的说法,我想用这个作业的价值&#34;。对于某些编译器,在值为常量的情况下,您可能会得到一个不同的,更强的警告,如我的示例中所示,与您的示例相比,但问题是相同的:如果您打算测试赋值的值,并且您不想在全球范围内禁用警告,说服GCC离开您的方式是使用额外的括号:while ((c = *str++))
。
有关详细信息,请参阅this question。您可能还想在GCC邮件列表中搜索this one之类的线程来讨论警告。