为了清楚起见,我理解循环是如何工作的。但是,不同的语法会给我带来问题......让我举个例子:
我正在查找递归排序算法(插入排序)。代码是这样的:
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'?
答案 0 :(得分:2)
表达式表示单个数据项 - 通常是数字。表达式可以由单个实体组成,例如constant
或variable
,或者它可以由这些实体的某种组合组成,由一个或多个运算符互连。表达式还可以表示true
或false
的逻辑条件。但是,在C中,条件true
和false
分别由非零整数值和零整数值表示。下面给出了几个简单的表达式:
a + b
x = y
t = u + v
x <= y
++j
在您的示例中,i
是一个表达式,其值为表达式l-value
,在这种情况下,它是变量i
的值。
如果true
的值为零,则表达式将评估为i
非false
值和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
本身会转换为布尔值,类似于i
或if (i) {...}
;整数在非零时被视为if (! i) {...}
,在零时被视为true
。
因此,false
相当于for(i=size-1 ; i ; i--)
。