代码之家  ›  专栏  ›  技术社区  ›  C.D. Reimer

C-缩写为仅执行一次的循环

  •  2
  • C.D. Reimer  · 技术社区  · 15 年前

    我有一个用ANSIC在Mac上编写的命令行实用程序,它有一个为单个链接列表创建气泡排序数组的函数。我声明了循环变量。

    int a = 0;   
    int b = 0;
    

    我用缩写的样式为循环编写了冒泡排序(即,将变量初始化留空)。

    for ( ; a < size; a++)  
      for( ; b < size; b++) 
    

    退出前只执行一次。使用i变量填充数组的前一个for循环以相同的方式编写并按预期执行。修复气泡排序循环的方法是将a=0和b=0放回去。缩写for循环执行失败的原因是什么?

    3 回复  |  直到 15 年前
        1
  •  11
  •   sepp2k    15 年前

    如果你把 b=0 内部循环将只运行一次,因为之后b已经等于大小。您需要在内部循环的每次迭代中将b重置为0。

        2
  •  2
  •   kriss    15 年前

    为什么要使用所谓的for循环的缩写样式?

    对于下面的while循环,for循环只是合成糖:

    for (INIT ; ENDTEST ; STEP){
        DO_SOME_STUFF
    }
    

    方法

    INIT
    while (ENDTEST) {
     DO_SOME_STUFF
     STEP
    }
    

    因此,您的两个循环正在执行:

    int a = 0;
    int b = 0;
    while (a < size){
       while (b < size){
          DO_SOME_STUFF
          b++;
       }
       a++;
    }
    

    在这种形式中,您可以很容易地看到B的初始化不是在应该的地方完成的。

    我所能说的就是避免使用缩写的for循环,删除初始化并不比删除结束测试或删除循环步骤(这两种方法在C中都是合法的)更好,所有这些都是将错误放入程序的简单方法。 别这么做。

        3
  •  1
  •   Anon.    15 年前

    填充数组的另一个for循环以相同的方式编写并按预期执行。

    这听起来像是在当前循环之前,使用了相同的变量 a b .

    之后没有将它们重置回零。