";"的目的是什么?在for循环结束?

Wie*_*n95 77 c 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;
}
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)

  • @Paulpro,我发现两者都是潜在的错误,并且`for(...){/*empty block*/}`比两者都更清楚,只要证明它是故意的. (19认同)
  • 这是一个更好的方法来编写一个空循环体(虽然在一行上写``}`可能是一个空洞的身体视觉上更容易的线索).如果它不是遗留代码,那么没有`;`空语句规则,语言会更好.在`do ... while(...)`之后的```是必须的,也是愚蠢的,但至少在那里我已经看到了一些巧妙的使用它. (7认同)
  • @EthanBierlein'work'由`()`中的语句完成; 这个循环的关键是最终得到`count`,它具有基于`zahl`的特定值 (6认同)
  • @MarcvanLeeuwen我发现```更具可读性.空块看起来像是一个意外,就像程序员忘记填充身体一样.空洞的陈述使他的意图清晰. (5认同)
  • 我不是一个"C"程序员,但为什么这样做会有用呢? (2认同)

Eli*_*gan 54

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

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

由于循环不需要执行任何操作,因此它使用空语句作为其主体.

如果;省略了末尾并且没有进行其他更改,则for循环之后的if语句本身将成为for循环的主体.(正如你所观察到的那样,这不是故意的,会破坏程序.)

但是,;在同一行上创建一个循环体并不是写一个空循环体的唯一方法,也不是最合理的方法.它工作得很好,但问题是其他读者 - 也许是同一个程序员,稍后返回项目 - 可能会怀疑它是否真的是一个错误.毕竟,当使用C风格的语言进行编码时,通常会在行的末尾键入一个分号,因此很容易键入一个不属于它的额外的分号.

另一个问题是,在代码中有一个线环;作为其机身所选择的风格,也很难认出时,有人居然已经作出把一个的错误;时,一个不属于.

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

  • ;的,凹陷的上下一行- 为SH1建议
  • 将循环体写为空块{ },而不是空语句
  • 使循环体成为一个continue;语句,这只会导致循环继续下一次迭代(这与循环体为空时发生的情况相同) - 同样如sh1所示

  • 另一个选项(可以与其他选项结合)是插入注释:`for(...)/*什么都不做*/;`,以明确它是故意的. (5认同)
  • 虽然我同意`;`和`{}`,但我会发现`继续;`非常奇怪.它会让我觉得有人希望"继续"外循环或某事.绝对是WTF的时刻,你想在代码中避免这些.我会说`{}`以最易读的方式捕获意图. (4认同)
  • @Massa - `for`循环按定义计算; 将增量子输出到循环之外,你没有理由使用`for` vs`with`. (3认同)
  • 我会在loop_里面添加变量_incrementing变量,例如:`for(count = 2; zahl%count!= 0 && zahl> = count;)++ count;` (2认同)

Roh*_*ams 42

for循环结束时的分号表示它没有主体.如果没有这个分号,C认为该if语句是for循环的主体.

  • + int(PI/3)用于点击而不进入"是好/坏编码实践"的辩论. (4认同)

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段中,它给出了一个例子

在程序片段中

char *s;
/* ... */
while (*s++ != '\0')
    ;
Run Code Online (Sandbox Code Playgroud)

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循环和具有语句的循环之间,后者需要较少的工作来理解其范围.

  • @coredump:考虑到这个循环的目的 - 在这种特殊情况下 - 是将`count`变为正确的值,以便可以进一步使用,`count`必须存在于更大的范围内,以便这完全可以工作,因此完全相同.(尽管如此,它仍然是对'for`循环的丑陋滥用,并且Federico是正确的,这是表达所涉及的语义的正确方法.) (2认同)

小智 13

;之后的for循环仅仅意味着for循环不会做任何超过增加计数器count.


fal*_*lla 13

for声明:

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

 for (initialize; test; step)
   statement
Run Code Online (Sandbox Code Playgroud)

[...]

空声明:

空语句只是单独一个分号.

 ;
Run Code Online (Sandbox Code Playgroud)

null语句不执行任何操作.它不会在任何地方存储值.在程序执行期间不会导致时间过去.

通常,null语句用作循环语句的主体,或者用作for语句中的一个或多个表达式.下面是一个for语句的示例,它使用null语句作为循环体(并且还计算n的整数平方根,只是为了好玩):

 for (i = 1; i*i < n; i++)
   ;
Run Code Online (Sandbox Code Playgroud)

下面是另一个使用null语句作为for循环体并产生输出的示例:

 for (x = 1; x <= 5; printf ("x is now %d\n", x), x++)
   ;
Run Code Online (Sandbox Code Playgroud)

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

因此,表现不同.


bmp*_*ini 11

for循环只是为了增加值count.


use*_*249 10

一个for循环将(通常)有一个身体,

身体被括起来的地方 { }

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

; 是一个空洞的陈述.

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


Ace*_*Ace 7

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

for循环后的if语句检查是否count等于zahl.如果是,那么这必然意味着循环遍历所有小于zahl和大于2 的数字.这意味着zahl可以被所有小于自身的数字整除,大于2,这就是zahl素数.