对C中的循环感到困惑

时间:2016-12-18 16:47:19

标签: c loops sorting recursion insertion-sort

为了清楚起见,我理解循环是如何工作的。但是,不同的语法会给我带来问题......让我举个例子:

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

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'?

3 个答案:

答案 0 :(得分:2)

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

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

在您的示例中,i是一个表达式,其值为表达式l-value,在这种情况下,它是变量i的值。 如果true的值为零,则表达式将评估为ifalse值和i

因此,for(i=(size-1); i ; i--)相当于for(i=(size-1); i != 0; i--)

答案 1 :(得分:2)

在C中,当试图评估一个条件时,0的所有内容都是假的,其他一切都是真的。

甚至指针都以同样的方式对待。常量NULL实际上定义为0.在C ++ 11中,我们最终得到了null_ptr用于类型安全。

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

答案 2 :(得分:0)

double x = in3DDirection[0], y = in3DDirection[1], z=in3DDirection[2]; double r = sqrt(x*x+y*y+z*z); theta = atan2(y,x); // range is -pi..pi phi = acos(z/r); // range is -pi/2..pi/2 本身会转换为布尔值,类似于iif (i) {...};整数在非零时被视为if (! i) {...},在零时被视为true

因此,false相当于for(i=size-1 ; i ; i--)