对于具有变量名称作为条件的循环流程。

时间:2013-08-26 10:00:27

标签: c for-loop

以下for循环有什么作用?程序何时会脱离循环?

for (c = 0; n; c++) {
  /* . . . */
}

以下是for循环in this answer on SO的示例。

5 个答案:

答案 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为假时,即当n0时(所有位都被删除,值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。当然,这是开玩笑..