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; } 

function的关键是检查一个数字是否是一个素数。

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

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

没有这个,代码不能正常工作。

什么是解释?

这意味着:

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

for循环具有for关键字,后面跟着括号,其中包含三个用分号隔开的可选expression式,后面跟着循环的每个迭代中执行的主体。

在你的例子中for循环的目标是设置count的值,这将在zahl的if语句中与zahl进行比较。 这是用分号分隔的expression式实现的,所以循环体不需要做任何事情。

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

如果; 在最后被省略,没有其他的改变,然后在for循环之后的if语句本身将成为for循环的主体。 (如你所见,这不是打算的,会打破这个计划。)

但是,使一个人的循环体由一个单一的; 在同一行不是编写空循环体的唯一方法,也不是最明智的方法。 它工作的很好,但问题在于其他读者(也许是同一个程序员,稍后返回到这个项目)可能会怀疑它是否真的是一个错误。 毕竟,在用C语言编写代码时,经常在行尾input分号,所以很容易在不属于的地方input多余的分号。

另一个问题是,在代码里用单线循环; 因为它的身体是被select的风格,所以很难认识到某人真的犯了一个错误, 当一个不属于。

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

  • ; ,缩进,在下一行 – 如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增加“计数器”的空语句的for循环)相当于

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

这将使得代码的目标比列出的一些替代scheme更加清晰:如果没有评论存在,就像在本例中那样,一个带有空语句的循环可能会混淆另一个必须维护或使用代码的程序员这里的OP的情况)。

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

The ;for循环之后for仅仅意味着for循环将不会增加计数器count

for声明 :

for语句是一个循环语句,其结构允许进行简单的variables初始化,expression式testing和variables修改。 制造反控回路非常方便。 这是for语句的一般forms:

  for (initialize; test; step) statement 

[…]

空声明 :

null语句仅仅是一个分号。

  ; 

一个空语句不会做任何事情。 它不会在任何地方存储一个值。 程序执行过程中没有时间通过​​。

大多数情况下,空语句用作循环语句的主体,或者用作for语句中的一个或多个expression式。 下面是一个for语句的例子,它使用null语句作为循环体(也计算n的整数平方根,只是为了好玩):

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

下面是另一个使用null语句作为for循环的主体的例子,它也产生输出:

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

空语句有时也用于跟随一个标签,否则这个标签是块中的最后一个东西。


在你的情况下, 是陈述的空 声明 :

 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成为表述:

 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循环会(通常)有一个body,

身体用括号括起来{ }

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

; 是一个空的陈述。

结合上面的内容,变得很明显, for循环执行直到条件变为false

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

for循环之后的if语句检查count是否等于zahl 。 如果是这样,那么这就意味着循环遍历所有小于zahl且大于2的数字。这意味着zahl可以被小于它自己的所有数字整除,并且大于2,这使zahl主数字。