C 为什么这个循环停止了?

C 为什么这个循环停止了?,c,while-loop,variable-assignment,C,While Loop,Variable Assignment,从回答中,我看到: 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; } 有人能告诉我到底是怎么回事吗?我强烈建议,在这里举个例子是最好的方法 括号应该放在哪里才能

从回答中,我看到:

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;
}
有人能告诉我到底是怎么回事吗?我强烈建议,在这里举个例子是最好的方法


括号应该放在哪里才能更清楚地说明这一点?

赋值的值就是被赋值的值。例如,此代码:

int a;
printf("%d\n", a=5);
…将打印出
5

因此,这个循环一直运行,直到
c
被赋值为false

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


该警告是因为
if(a=5)
if(a==5)
的打字错误,其频率高于它的故意代码。在赋值周围加上括号,比如
if((a==5))
,是一种表达“我想使用这个赋值的值”的惯用方式。对于某些编译器,在值为常量的情况下(如我的示例中),您可能会收到与您的示例不同的、更强烈的警告,但问题是相同的:如果您打算测试赋值的值,并且不想全局禁用警告,说服GCC离开您的方法是附加括号:
while((c=*str++)


有关更多详细信息,请参阅。您可能还希望在GCC邮件列表中搜索线程,例如讨论警告。

赋值的值就是被赋值的值。例如,此代码:

int a;
printf("%d\n", a=5);
…将打印出
5

因此,这个循环一直运行,直到
c
被赋值为false

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


该警告是因为
if(a=5)
if(a==5)
的打字错误,其频率高于它的故意代码。在赋值周围加上括号,比如
if((a==5))
,是一种表达“我想使用这个赋值的值”的惯用方式。对于某些编译器,在值为常量的情况下(如我的示例中),您可能会收到与您的示例不同的、更强烈的警告,但问题是相同的:如果您打算测试赋值的值,并且不想全局禁用警告,说服GCC离开您的方法是附加括号:
while((c=*str++)


有关更多详细信息,请参阅。您可能还想在GCC邮件列表中搜索类似于讨论警告的线程。

“通常情况下,赋值结果不是真的?我的意思是如果(a=5)是真的。”这似乎是一个矛盾。“括号应该放在哪里才能更清楚地说明这一点?”没有,真的;此警告是一条红鲱鱼,专为其他情况而设计。@LightnessRacesinOrbit感谢您的评论!这不仅仅是新手程序员经常犯的错误,也是有经验的程序员经常犯的错误。(这就是为什么很多老年人写
if(5=a)
,因为如果他们不小心把它打成
if(5=a)
,那是一个错误。但是年轻的程序员不需要知道这一点,因为现代的编译器有类似这样的警告。)@abarnert:“这也是有经验的程序员常见的打字错误。”你可以自己说,但作为一名经验丰富的程序员,我从来没有犯过这样的错误,我周围的人也没有犯过这样的错误。这很容易避免。这就是为什么我们不切换到可怕的Yoda条件,并不是因为某些编译器对此有警告诊断。“通常赋值结果不是真的?我的意思是如果(a=5)将是真的。”这似乎是一个矛盾。“括号应该放在哪里才能更清楚地说明这一点?”没有,真的;此警告是一条红鲱鱼,专为其他情况而设计。@LightnessRacesinOrbit感谢您的评论!这不仅仅是新手程序员经常犯的错误,也是有经验的程序员经常犯的错误。(这就是为什么很多老年人写
if(5=a)
,因为如果他们不小心把它打成
if(5=a)
,那是一个错误。但是年轻的程序员不需要知道这一点,因为现代的编译器有类似这样的警告。)@abarnert:“这也是有经验的程序员常见的打字错误。”你可以自己说,但作为一名经验丰富的程序员,我从来没有犯过这样的错误,我周围的人也没有犯过这样的错误。这很容易避免。这就是为什么我们不切换到可怕的Yoda条件,并不是因为某些编译器对它有警告诊断。正确,我只是检查了
if(a=0)
。你打算在括号里提到什么吗?我刚才说的警告在这里
while(c=*str++)
@G.Samaras:是的,这仍然是一个任务。这不符合关于测试常量赋值的更强烈警告,但它确实符合关于测试任何赋值的较弱警告。@G.Samaras:好的,我从上一条评论中不确定,我想最好把它完全弄清楚,而不是让它可能不清楚。@G.Samaras,关于括号警告。在诸如
while((c=*str++)!=0)
之类的语句中,括号必须优先于
=
over
=
但在本例中,任何非0值都隐含着真理。正确,我刚刚检查了
如果(a=0)
。你打算在括号里提到什么吗?我刚才说的警告在这里
while(c=*str++)
@G.Samaras:是的,这仍然是一个任务。这不符合关于测试常量赋值的更强烈警告,但它确实符合关于测试任何赋值的较弱警告。@G.Samaras:好的,我从上一条评论中不确定,我想最好把它完全弄清楚,而不是让它可能不清楚。@G.Samaras,关于括号警告。在诸如
while((c=*str++)!=0)
之类的语句中,括号必须优先于
=超过<代码