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)
任何人都可以告诉我关于循环的确切情况吗?我强烈建议一个例子是这里最好的方法.
括号还应该在哪里使这个更清楚?
赋值的值是指定的值.例如,这段代码:
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邮件列表中搜索类似这样的线程来讨论警告.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |