为什么这个循环停止?

时间:2014-11-12 23:47:03

标签: c while-loop variable-assignment

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]

任何人都可以告诉我关于循环的具体内容吗?我强烈建议一个例子是最好的方法。

括号还应该在哪里更明确?

1 个答案:

答案 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之类的线程来讨论警告。