为什么这个循环停止?

gsa*_*ras 0 c variable-assignment while-loop

这个答案,我看到了这个:

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;
}
Run Code Online (Sandbox Code Playgroud)

问题是我没有看到while停止执行的方式.一般来说,作业不是真的吗?我的意思if(a = 5)是真的.

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

warning: suggest parentheses around assignment used as truth value [-Wparentheses]
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我关于循环的确切情况吗?我强烈建议一个例子是这里最好的方法.

括号还应该在哪里使这个更清楚?

aba*_*ert 5

赋值的值是指定的值.例如,这段代码:

int a;
printf("%d\n", a=5);
Run Code Online (Sandbox Code Playgroud)

......会打印出来5.

因此,此循环运行直到c被赋予错误.

并且在C中,0为false,并且字符串以空值终止,因此在字符串的末尾,NUL字符0将结束循环.


警告是因为它if (a = 5)是一个错字,if (a == 5)比它的故意代码更频繁.在作业周围添加额外的括号if ((a == 5)),是一种惯用的方式来说"我打算使用这个作业的价值".对于某些编译器,在值为常量的情况下,您可能会得到一个不同的,更强的警告,如我的示例中所示,与您的示例相比,但问题是相同的:如果您打算测试赋值的值,并且你不想在全球范围内禁用警告,说服GCC离开你的方法是使用额外的括号:while ((c = *str++)).

有关详细信息,请参阅此问题.您可能还想在GCC邮件列表中搜索类似这样的线程来讨论警告.