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