我找到了以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
功能点是检查数字是否是素数.
我不明白为什么for循环;
最后:
v
for (count = 2; zahl % count != 0 && zahl >= count; count++);
Run Code Online (Sandbox Code Playgroud)
没有它,代码就无法正常工作.
解释是什么?
M.M*_*M.M 87
它意味着完全相同:
for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
Run Code Online (Sandbox Code Playgroud)
Eli*_*gan 54
for循环有for
关键字,后跟括号,其中包含由分号分隔的三个可选表达式,后跟一个在循环的每次迭代中执行的主体.
在您的示例中,for循环的目标是设置值count
,该值将与后面zahl
的if语句进行比较.这是以分号分隔的表达式实现的,因此循环体不需要做任何事情.
由于循环不需要执行任何操作,因此它使用空语句作为其主体.
如果;
省略了末尾并且没有进行其他更改,则for循环之后的if语句本身将成为for循环的主体.(正如你所观察到的那样,这不是故意的,会破坏程序.)
但是,;
在同一行上创建一个循环体并不是写一个空循环体的唯一方法,也不是最合理的方法.它工作得很好,但问题是其他读者 - 也许是同一个程序员,稍后返回项目 - 可能会怀疑它是否真的是一个错误.毕竟,当使用C风格的语言进行编码时,通常会在行的末尾键入一个分号,因此很容易键入一个不属于它的额外的分号.
另一个问题是,在代码中有一个线环;
作为其机身所选择的风格,也很难认出时,有人居然已经作出把一个的错误;
时,一个不属于.
因此,这些替代方案可能更可取:
;
的,凹陷的上下一行- 为SH1建议{ }
,而不是空语句continue;
语句,这只会导致循环继续下一次迭代(这与循环体为空时发生的情况相同) - 同样如sh1所示hac*_*cks 23
for
循环语法(迭代语句)是
for ( clause-1 ; expression-2 ; expression-3 ) statement
Run Code Online (Sandbox Code Playgroud)
statement
可以是null语句(;
).C11 6.8.3说
空语句(仅由分号组成)不执行任何操作.
在第5段中,它给出了一个例子
在程序片段中
Run Code Online (Sandbox Code Playgroud)char *s; /* ... */ while (*s++ != '\0') ;
null语句用于向迭代语句提供空循环体.
同样的事情正在发生
for (count = 2; zahl % count != 0 && zahl >= count; count++);
Run Code Online (Sandbox Code Playgroud)
;
用于向for
语句提供空循环体.如果没有循环;
旁边的语句for
将被视为其正文并将被执行.
Fed*_*ico 18
除了已经说过的其他优秀答案之外,我想指出这一点
for(count=2; zahl % count != 0 && zahl >= count; count++);
Run Code Online (Sandbox Code Playgroud)
(也就是说,一个for
带有用于递增"计数器"的空语句的循环)相当于
count=2;
while(zahl % count != 0 && zahl >= count)
{
count++;
}
Run Code Online (Sandbox Code Playgroud)
这将使代码的目标比一些列出的替代方案更清晰:如果不存在注释,如在所示的情况下,具有空语句的循环可能会混淆另一个必须保持或使用代码的程序员(就像这里OP的情况).
上下文可能有助于辨别语句的真实范围,但在for
具有空语句的while
循环和具有语句的循环之间,后者需要较少的工作来理解其范围.
fal*_*lla 13
for语句是一个循环语句,其结构允许简单的变量初始化,表达式测试和变量修改.制作反控制回路非常方便.以下是for语句的一般形式:
Run Code Online (Sandbox Code Playgroud)for (initialize; test; step) statement
[...]
空声明:
该空语句只是单独一个分号.
Run Code Online (Sandbox Code Playgroud);
null语句不执行任何操作.它不会在任何地方存储值.在程序执行期间不会导致时间过去.
通常,null语句用作循环语句的主体,或者用作for语句中的一个或多个表达式.下面是一个for语句的示例,它使用null语句作为循环体(并且还计算n的整数平方根,只是为了好玩):
Run Code Online (Sandbox Code Playgroud)for (i = 1; i*i < n; i++) ;
下面是另一个使用null语句作为for循环体并产生输出的示例:
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
没有它,它就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;
}
Run Code Online (Sandbox Code Playgroud)
因此,表现不同.
use*_*249 10
一个for
循环将(通常)有一个身体,
身体被括起来的地方 {
}
但是,对于单个语句体,大括号是可选的.
;
是一个空洞的陈述.
结合上述内容,很明显for
循环执行直到条件变为false
.
for循环基本上循环遍历所有小于或等于zahl
但大于2的数字并将其存储在变量中count
.当它遍历所有这些数字时,它会检查是否可zahl
被整除count
.如果可zahl
被整除count
,则循环停止.否则,count
等于时循环停止zahl
.
for循环后的if语句检查是否count
等于zahl
.如果是,那么这必然意味着循环遍历所有小于zahl
和大于2 的数字.这意味着zahl
可以被所有小于自身的数字整除,大于2,这就是zahl
素数.