我找到了以下代码:
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++);
如果不这样,代码就无法正常工作。
解释是什么?
答案 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语句是一个循环语句,其结构很容易 变量初始化,表达式测试和变量 修改。制作反控制非常方便 循环。以下是for语句的一般形式:
for (initialize; test; step) 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 Statement的for
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循环用于的语句。不能为空。至少它应该包含一个语句。 ;是要为其执行迭代的空语句。