gpt4 book ai didi

c - 为什么这个循环停止?

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:19 24 4
gpt4 key购买 nike

来自 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;
}

问题是我没有看到 while 是如何停止执行的。一般来说,一个任务不是真的吗?我的意思是 if(a = 5) 将为真。

编译器也给了我这个警告:

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

谁能告诉我循环到底发生了什么?我会强烈建议在这里举个例子是最好的方法。

另外,括号应该放在哪里才能使这一点更清楚?

最佳答案

赋值的值是被赋值的值。例如,这段代码:

int a;
printf("%d\n", a=5);

... 将打印出 5

因此,此循环一直运行到 c 被赋值为假。

而在 C 中,0 为假,字符串以 null 结尾,因此在字符串的末尾,NUL 字符 0 将结束循环.


警告是因为 if (a = 5)if (a == 5) 的拼写错误,而不是有意编写的代码。在赋值周围加上额外的括号,如 if ((a == 5)),是表达“我打算使用该赋值的值”的惯用方式。对于某些编译器,在值恒定的情况下(如我的示例),您可能会收到与您的示例不同的、更强烈的警告,但问题是相同的:如果您打算测试赋值的值,并且您不想全局禁用警告,说服 GCC 让您离开的方法是使用额外的括号:while ((c = *str++))

参见 this question更多细节。您可能还想在 GCC 邮件列表中搜索类似 this one 的主题。讨论警告。

关于c - 为什么这个循环停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com