&#34 ;;"的目的是什么?在for循环结束?

时间:2015-04-23 23:28:07

标签: c for-loop

我找到了以下代码:

int func_prim (int zahl) {
    int count;
    if (zahl < 0)
        return -1;

    for (count = 2; zahl % count != 0 && zahl >= count; count++);
    if (count == zahl)
        return 1;
    return 0;
}

功能的关键是检查数字是否为素数。

我不明白为什么for循环最后有;

                                                            v
for (count = 2; zahl % count != 0 && zahl >= count; count++);

如果不这样,代码就无法正常工作。

解释是什么?

11 个答案:

答案 0 :(得分:88)

这意味着完全相同:

for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}

答案 1 :(得分:54)

for循环具有for关键字,后跟括号,其中包含由分号分隔的三个可选表达式,后跟在循环的每次迭代中执行的主体。

示例中for循环的目标是设置count的值,该值将在后面的if语句中与zahl进行比较。这是以分号分隔的表达式实现的,因此循环体不需要做任何事情。

由于循环不需要做任何事情,因此它使用空语句作为其主体。

如果省略了最后的;并且没有进行其他更改,则for循环之后的if语句本身将成为for循环的主体。 (正如你所观察到的那样,这不是故意的,会破坏程序。)

然而,在同一行上创建一个单独的;循环体并不是编写空循环体的唯一方法,也不是最合理的方法。它工作得非常好,但问题是其他读者 - 也许是同一个程序员,稍后返回项目 - 可能会怀疑它是否真的是一个错误。毕竟,当使用C风格的语言进行编码时,通常会在行的末尾键入一个分号,因此很容易键入一个不属于它的额外的分号。

另一个问题是,在代码中,以;为主体的单行循环是所选择的样式,当某人实际拥有时,很难识别 犯了一个错误:当一个人不属于;时。{/ p>

因此,这些替代方案可能更为可取:

  • ;缩进,放在下一行 - as sh1 suggests
  • 将循环体写为空块{ },而不是空语句
  • 使循环体成为continue;语句,这只会导致循环继续进行下一次迭代(这与循环体为空时发生的情况相同) - also as sh1 suggests < / LI>

答案 2 :(得分:42)

for-loop末尾的分号表示它没有正文。如果没有这个分号,C认为if语句是for循环的主体。

答案 3 :(得分:23)

for循环的语法(迭代语句)是

for ( clause-1 ; expression-2 ; expression-3 ) statement 

statement可以是 null语句;)。 C11 6.8.3说

  

null语句(仅由分号组成)不执行任何操作。

在第5段中给出了一个例子

  

在程序片段中

char *s;
/* ... */
while (*s++ != '\0')
    ;
     

null语句用于向迭代语句提供空循环体

同样的事情发生在

for (count = 2; zahl % count != 0 && zahl >= count; count++);

;用于向for语句提供空循环体。如果没有;for循环旁边的语句将被视为其正文并将被执行。

答案 4 :(得分:18)

除了已经说过的其他优秀答案之外,我想指出

for(count=2; zahl % count != 0 && zahl >= count; count++);

(即带有用于递增“计数器”的空语句的for循环等同于

count=2;
while(zahl % count != 0  && zahl >= count)
{
    count++;
}

这将使代码的目标比一些列出的替代方案更清晰:如果不存在注释,如在所示的情况下,具有空语句的循环可能会混淆另一个必须保持或使用代码的程序员(就像OP的情况一样)。

上下文可能有助于辨别语句的真实范围,但在带有空语句的for循环和带有语句的while循环之间,后者需要较少的工作来理解其范围。

答案 5 :(得分:13)

;循环之后的for只是意味着for循环不会做任何事情,只会增加计数器count

答案 6 :(得分:13)

for Statement

  

for语句是一个循环语句,其结构很容易   变量初始化,表达式测试和变量   修改。制作反控制非常方便   循环。以下是for语句的一般形式:

 for (initialize; test; step)
   statement
     

[...]

Null Statement

  

null语句仅仅是一个分号。

 ;
     

null语句不执行任何操作。它不会在任何地方存储值。   在执行期间不会导致时间过去   你的计划。

     

通常,null语句用作循环语句的主体,   或者作为for语句中的一个或多个表达式。这是一个   使用null语句作为主体的for语句的示例   循环(并且还计算n的整数平方根,仅用于   有趣):

 for (i = 1; i*i < n; i++)
   ;
     

这是另一个使用null语句作为主体的示例   一个for循环并产生输出:

 for (x = 1; x <= 5; printf ("x is now %d\n", x), x++)
   ;
     

null语句有时也用于跟随标签   否则是一个街区中的最后一件事。

在您的情况下,;Null Statementfor Statement

int func_prim (int zahl) {
  int count;
  if (zahl < 0)
    return -1;

  for (count = 2; zahl % count != 0 && zahl >= count; count++)
    ;
  if (count == zahl)
    return 1;
  return 0;
}

没有它,if成为for语句:

int func_prim (int zahl) {
  int count;
  if (zahl < 0)
    return -1;

  for (count = 2; zahl % count != 0 && zahl >= count; count++)
    if (count == zahl)
      return 1;
  return 0;
}

因此,表现不同。

答案 7 :(得分:11)

for循环只是为了增加count的值。

答案 8 :(得分:10)

for循环(通常)会有一个正文,

其中正文括在大括号{ }

但是,对于单个语句正文,大括号是可选的。

;是一个空的陈述。

结合上述内容,显然for循环执行,直到条件变为false

答案 9 :(得分:7)

for循环基本上循环遍历小于或等于zahl但大于2的所有数字并将其存储在变量count中。当它遍历所有这些数字时,它会检查zahl是否可以被count整除。如果zahl可被count整除,则循环停止。否则,当count等于zahl时,循环将停止。

for循环后的if语句检查count是否等于zahl。如果是,那么这必然意味着循环遍历了小于zahl且大于2的所有数字。这意味着zahl可被所有小于其自身且大于2的数字整除,其中使zahl素数。

答案 10 :(得分:0)

它指示for循环用于的语句。不能为空。至少它应该包含一个语句。 ;是要为其执行迭代的空语句。