对 C 中的 for 循环感到困惑

Puzzled about for loops in C

澄清一下,我了解 for 循环的工作原理。但是,不同的语法给我带来了问题......让我举个例子:

我在查找递归排序算法(插入排序)。代码是这样的:

void insertion_recursive(int array[],int size){
int i;

if (size<=1) return;

insertion_recursive(array,size-1);

for(i=size-1;i;i--)
   if(array[i]<array[i-1])
       swap(&array[i],&array[i-1]);
   else
       break;
}

我明白代码是如何工作的,但是循环的条件让我感到困惑:

for(i=size-1 ; i ; i--)

这是什么意思?不指定条件就离开'i'?

i 本身被转换为布尔值,类似于 if (i) {...}if (! i) {...};整数在非零时被视为 true,在零时被视为 false

因此,for(i=size-1 ; i ; i--) 等同于 for(i=size-1 ; i != 0; i--)

一个表达式代表一个数据项——通常是一个数字。表达式可能由单个实体组成,例如 constantvariable,或者它可能由此类实体的某种组合组成,由一个或多个运算符互连。表达式还可以表示 truefalse 的逻辑条件。然而,在 C 中,条件 truefalse 分别由非零整数值和零整数值表示。下面给出几个简单的表达式:

a + b
x = y
t = u + v
x <= y
++j

在您的示例中,i 是一个表达式,其值是表达式的 l-value,在本例中,它是变量 i 的值。 对于非零 i 值,表达式将求值为 true,如果 i 的值为零,则表达式求值为 false

因此,for(i=(size-1); i ; i--) 等同于 for(i=(size-1); i != 0; i--)

在 C 中尝试计算条件时,0 为假,其他为真。

甚至指针也以同样的方式处理。常量 NULL 实际上定义为 0。在 C++11 中,我们终于有了类型安全的 null_ptr。

在 C 中没有 bool 类型,在 C++ 中,如果将 true 转换为整数,您将得到 1,将 false 转换为 0。