繁体   English   中英

“;”的目的是什么在 for 循环结束时?

[英]What is the purpose of “;” at the end of 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++);

没有它,代码就不能正常工作。

解释是什么?

它的意思完全相同:

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

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

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

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

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

但是,使一个循环体由单个;组成; 在同一行上不是编写空循环体的唯一方法,也可能不是最明智的方法。 它工作得很好,但问题是其他读者——也许是同一个程序员,稍后返回项目——可能会怀疑这是否真的是一个错误。 毕竟,在用 C 风格的语言进行编码时,经常会在行尾键入分号,因此很容易在不属于它的地方键入额外的分号。

另一个问题是,在单行循环的代码中; 它的身体是所选样式,它是难以辨认时,有人竟做出把一个的错误; 当一个人不属于。

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

  • ; ,缩进,在下一行—— 正如 sh1 所建议的
  • 将循环体写为一个空块{ } ,而不是一个空语句
  • 使循环体continue; 语句,它只会导致循环继续进行下一次迭代(这与循环体为空时发生的情况相同)—— 也正如 sh1 所建议的

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

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

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

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

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

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

在程序片段中

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

空语句用于为迭代语句提供一个空循环体

同样的事情发生在

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

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

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

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

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

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

这将使代码的目标比列出的一些替代方案更清晰:如果不存在注释,如在呈现的情况下,带有空语句的循环可能会混淆另一个必须维护或使用代码的程序员(如OP在这里的情况)。

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

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

for声明

for 语句是一个循环语句,其结构允许简单的变量初始化、表达式测试和变量修改。 制作反控循环非常方便。 下面是for语句的一般形式:

 for (initialize; test; step) statement

[...]

空语句

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 语句有时也用于跟在一个标签之后,否则该标签将成为块中的最后一件事。


在你的情况下, ; 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;
}

没有它, 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;
}

因此,行为不同。

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

for循环(通常)会有一个主体,

正文括在大括号{ }

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

; 是一个空语句。

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

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

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

它指示 for 循环用于的语句。 不能为空。 至少它应该包括一个单一的声明。 ; 是完成迭代的空语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM