for while与while循环语句

时间:2016-10-26 14:40:59

标签: c

forwhile语句之间有区别吗?它只是语法吗?

#include <stdio.h>

void main() {
    int cent_temp = 0;
    int fah_temp;
    while (cent_temp <= 20) {
        fah_temp = (9 * cent_temp) / 5 + 32;
        printf("%d degrees C = %d degrees F\n", cent_temp, fah_temp);
        cent_temp++;
    }
}

这对我意味着......

虽然cent_temp的值小于20,但计算fah_temp。然后按cent_temp增加1的值并检查它是否仍然小于20;然后再次绕圈。

关于语法:

printf("%d degrees C = %d degrees F\n", cent_temp, fah_temp);

这意味着%d表示打印到屏幕,用十进制数替换cent_temp%d的值表示用小数字替换fah_temp的值。

#include <stdio.h>

void main() {
    int cent_temp;
    int fah_temp;
    for (cent_temp = 0; cent_temp <= 20; cent_temp++) {
        fah_temp = (9 * cent_temp) / 5 + 32;
        printf("%2d degrees C = %2d degrees F\n", cent_temp, fah_temp);
    }
}

我对上述的解释是: cent_temp = 0重复cent_temp小于20,然后在最后执行cent_temp+1。因此cent_temp 0进入循环计算fah_temp并打印到屏幕上。然后cent_temp上升一个然后再循环。在这里,我使用%2d而不是%d来表示它应该有一个十进制数的空格(并且它们在执行时排成一行)。如果cent_temp > 20,则不会执行这两个代码。

同样,在do while循环中重新排列语句也会产生类似的效果,并且不会对结果产生任何影响。

每种类型的循环都有不同的应用程序吗?

如果我错了,请纠正我!

6 个答案:

答案 0 :(得分:3)

  

'for'和'while'语句之间有区别吗?它只是   语法?

对我来说,这只是语法。

来自 K&amp; R部分3.5循环 - 而对于,我引用:

  

for声明

for (expr1; expr2; expr3)
  statement
     

相当于

expr1;
while (expr2) {
  statement
  expr3;
}
     

除了continue的行为。

     

在语法上,for循环的三个组件是表达式。   最常见的是,expr1expr3是分配或函数调用   expr2是一个关系表达式。

备注

正如用户@chqrlie在评论中提到的那样,breakcontinue之类的控制语句会使情况略显模糊。

在某些情况下,循环体中需要修改语句。例如Erase-remove idiom with std::set failing with constness-related error(在C ++中)

示例

作为一个例子,让我们编写一个循环来打印1到100之间的所有奇数。

int i = 1;
while (i <= 100) {
  printf("%d\n", i);
  i += 2;
}

for (int i = 1; i <= 100; i += 2) {
  printf("%d\n", i);
}

<强>意见

我不是语言专家,但在实践中的大多数情况下,我发现它们是可转换的。

我个人更喜欢使用for语法,因为:

  • 循环控制结构位于一个单独的位置(for标题),便于阅读,
  • 循环变量(例如i)不会暴露给外部范围。

答案 1 :(得分:2)

for(cent_temp = 0; cent_temp <= 20; cent_temp++)
{ /* code */ }

100%相当于

cent_temp = 0;
while(cent_temp <= 20)
{
  /* code */
  cent_temp++;
}

但是do-while是不同的,因为它将条件检查放在最后。

至于什么时候使用哪个循环,这是一个风格问题,因此有点主观。大多数C程序员使用的行业事实上的标准风格如下:

    执行已知迭代次数时,应始终使用
  • for个循环。它被认为是最易读的形式。
  • 应该使用
  • while循环,事先知道迭代次数,或者由于某种原因循环变得复杂。例如,如果您需要在循环体内更改循环迭代器变量,那么您应该使用while循环而不是for循环。
  • do while循环应该用于需要在循环的第一圈跳过条件检查的特殊情况,例如do { result = send(); } while(result == ok);

答案 2 :(得分:2)

我查看了Steve McConnell的代码完整 (圣经)

以下是您在第16章中可以阅读的内容:

当你需要一个执行指定次数的循环时,for循环是一个不错的选择。 [...]

对于不需要内部循环控件的简单活动,使用for循环。当循环涉及简单的增量或简单的减量时使用它们,例如迭代容器中的元素。 for循环的要点是你将它设置在循环的顶部然后忘掉它。你不必在循环内做任何事来控制它。如果你有一个执行必须跳出循环的条件,那就改用while循环。

同样,不要显式更改for循环的索引值以强制终止。请改用while循环。 for循环用于简单用途。最复杂的循环任务可以通过while循环更好地处理。

答案 3 :(得分:1)

通常,您将使用for循环来迭代一组有限的值,而您将使用whiledo-while循环来迭代特定条件或一套条件是真的。在大多数C的同时代人(Basic,Pascal,Fortran等)中,for循环只能 迭代标量索引:

的Fortran:

      DO 10 i=1,10
        statements
   10 CONTINUE

帕斯卡:

for i := 1 to 10 do
begin
  statements
end;

这两个片段都恰好循环了10次。索引i由循环自动初始化和更新。我必须回去检查,但我很确定你不能在循环体中写入i

C实际上通过添加控件表达式来模糊forwhile循环之间的线:

for ( init-expr ; control-expr ; update-expr )
  statement

在C中,for循环可以像Fortran或Pascal一样遍历标量:

for( i = 0; i < 10; i++ )
{
  do_something_with( i );
}

或者它可以迭代多个标量:

for ( i = 0, j = 0; i < 10 && j < 10; i++, j++ )
{
  do_something_with( i, j );
}

或者它可以遍历文件的内容:

for( c = fgetc( in ); c != EOF; c = fgetc( in ) )
{
  do_something_with( c );
}

或者它可以迭代链表:

for( cur = head; cur != NULL; cur = cur->next )
{
  do_something_with( cur );
}

在Fortran和Pascal中,最后三个循环必须表示为while循环(我不会这样做,因为我已经非常耗尽了我的Fortran和Pascal知识)。

C for循环与Fortran或Pascal循环之间的另一个重要区别是,您可以写入循环索引(ijc,或循环体中的cur);它没有受到任何特别的保护。

只要特定条件或条件集合为真,就会使用whiledo-while循环进行迭代:

while( control-expr )
  statement
do
  statement
while( control-expr );

forwhile循环中,条件在循环体执行之前进行测试;在do-while循环中,在循环体执行之后测试条件,因此do-while循环将始终至少执行一次。

在C中,您可以在许多情况下使用for循环或while循环:

while ( ( c = fgetc( in ) ) != EOF )
  do_something_with( c );

for ( c = fgetc( in ); c != EOF; c = fgetc( in ) )
  do_something_with( c );

两个循环完全相同;只是你认为哪一个更明确地表达了你的意图,或者你认为其他人更容易理解的问题。

答案 4 :(得分:0)

从算法的角度来看,虽然不一样。简而言之,在算法中,应该在已知边界时使用,而在您不知道条件是否可以满足时或何时可以使用时使用。因为是重复n次(已知),这正是你的例子计算的情况;应该使用for循环(你不觉得循环在for循环中更明确地说明了什么吗?)。如果你想要一个必须在循环中使用的例子,看看像Collat​​z序列这样的东西。从可计算性的角度来看,for循环总是可以在while循环中转换而不是相反的转换。

从计算机语言的角度来看,现在通常将两者融合,例如,在C语言中,它没有区别,只有语法。但请记住,在其他一些可能非常不同的语言中,例如在Pascal for循环中非常有限。

答案 5 :(得分:0)

源代码不仅可以由计算机编译和执行,还可以被人类阅读和理解。

计算机并不介意使用for循环,while循环还是goto。另一方面,人类期望不同结构的不同含义。

  • 在已知输入范围内计算值最好用for循环显示;
  • 最好用while循环显示文件到最后。

选择使用哪种结构与选择变量名称类似。