对于(gap = n / 2; gap> 0; gap / = 2),不带“;”在它的尽头

时间:2018-10-14 13:21:54

标签: c

我在“ C编程语言版本2”中阅读了以下代码

/* shellsort: sort v[0] ... v[n-1] into increasing order */
void shellsort(int v[], int n) {
    int gap, i, j, temp;

    for (gap = n/2; gap > 0; gap /= 2) 
        for (i = gap; i < n; i++)
            for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }

}

令我困惑的是,这里没有“;”在“ for循环行”的末尾,我认为应该是

    for (gap = n/2; gap > 0; gap /= 2) ;
        for (i = gap; i < n; i++);
            for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }

我如何直观地将其包装?

3 个答案:

答案 0 :(得分:2)

声明

for (gap = n/2; gap > 0; gap /= 2) ;

等于

for (gap = n/2; gap > 0; gap /= 2)
    ;

等于

for (gap = n/2; gap > 0; gap /= 2)
{
}

换句话说,这是一个空循环,除了每次迭代比较gap > 0gap /= 2(循环的一部分)之外,什么都不做。

答案 1 :(得分:1)

for循环以适当的次数运行代码中的下一条语句。通常,该语句是单个语句,或大括号中的一组语句。如果您改用分号,则将其视为null statement,因此“无任何操作”会执行适当的次数。

如果您说“我如何直观地将其包裹起来”是什么意思?这样可能更容易回答您的问题。

答案 2 :(得分:1)

for循环的语法(为清楚起见已简化):

for ( ... ) <statement>

statement:
     ';'  // empty statement
      <any other statement>
     '{' ... '}'  // block of statements

因此,在for语句之后是一个或一个语句块。单个;是一条语句,即空(不执行任何操作)语句。所以

for (....) ;
    for (....) ;

不是 嵌套的for循环。等效于:

for (....) ;
for (....) ;

for (....) {}
for (....) {}