答案 0 :(得分:10)
当n
变为0
时,循环将中断(换句话说,循环在n
变为0
之前不会停止)。这可能发生在循环内(循环体最终将n
设置为0
),或者由于某些外部事件而可能发生。外部事件的示例可以是共享内存更新,也可以是信号处理程序的修改。 c
变量在for
循环输入循环体的次数增加了很多倍。 c
变量初始化为0
。
从技术上讲,您的代码片段不是问题标题和帖子已被修改。 for
循环,而只是for
循环语句的控制结构。片段缺少循环体。但是没关系,因为你的问题标题是关于“这个for
- 循环结构”。
您链接到不同答案中的函数,但您似乎已经明白该函数的目的是计算数字中的设置位数。
答案 1 :(得分:4)
编辑:这个答案解释了错误地给出的链接问题中的按位操作。它仍然解释了最后的终止。
链接代码如下:
long count_bits(long n) {
unsigned int c; // c accumulates the total bits set in v
for (c = 0; n; c++)
n &= n - 1; // clear the least significant bit set
return c;
}
这里有趣的一行是n &= n - 1;
。这会将n
设置为n & (n - 1)
,其中&
是按位AND运算符。例子说它清除了最低有效位,即将最低单位设置为0,这正是它的作用,这就是原因。
想象一下这个例子,我们有数字,例如:
01010100
如果我们减少(取1),我们得到:
01010011
***
每次我们递减时,最低位被删除,下面的位变为1.这就是减法的工作方式,它相当于1000 - 1 = 999(十进制),但有两位而不是十位。
现在我们&他们在一起:
01010100
&01010011
=01010000
***
按位&如果两个输入的位都是1,则只将位设置为1。
因此,您可以看到操作总是删除最低设置位,因为减法后最低位变为0,并且减法前下面的位数为0:所有这些位都不能同时为&操作,因此评估为0.所有其他设置位保持不变,因此为操作提供两个1并保持其值。
当条件n
为假时,即当n
为0
时(所有位都被删除,值00000000
),循环终止。因此,这是在删除每个位之后,c
将保留n
中位数的值。
请记住,在C中,当数字形式为非零时,布尔值被认为是“真”,当数字形式为零时,被认为是“假”。
答案 2 :(得分:2)
C标准指定for
子句中的“中间事物”是表达式。只要该表达式求值为非零,循环就会继续。所以n
是一个表达式,一旦n
为零,将导致循环终止。更明确的形式是
for (c = 0; n != 0; c++)
任何体面的编译器都编译成相同的代码。
事实上,C标准允许作为特例,“中间事物”为空,在这种情况下,它被认为是 true 。这就是我们可以编写无限循环的原因
for (;;) { ... }
而不是丑陋的地狱可憎while(1)
。
答案 3 :(得分:0)
简单来说,它相当于for( c = 0; n != 0; c++)
答案 4 :(得分:0)
嘿..
[案例1] - 没有循环的迭代
int c, n = &c;
for (c = 0; n; c++) {
/* . . . */
}
[案例2] - 没有循环的迭代
int c, n = 0;
for (c = 0; n; c++) {
/* . . . */
}
[案例3] - 无限循环的迭代
int c, n = ...; // any value, except 0
for (c = 0; n; c++) {
/* . . . */
}
还有其他情况吗?
PS。当然,这是开玩笑..