对 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--)
。
一个表达式代表一个数据项——通常是一个数字。表达式可能由单个实体组成,例如 constant
或 variable
,或者它可能由此类实体的某种组合组成,由一个或多个运算符互连。表达式还可以表示 true
或 false
的逻辑条件。然而,在 C 中,条件 true
和 false
分别由非零整数值和零整数值表示。下面给出几个简单的表达式:
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。
澄清一下,我了解 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--)
。
一个表达式代表一个数据项——通常是一个数字。表达式可能由单个实体组成,例如 constant
或 variable
,或者它可能由此类实体的某种组合组成,由一个或多个运算符互连。表达式还可以表示 true
或 false
的逻辑条件。然而,在 C 中,条件 true
和 false
分别由非零整数值和零整数值表示。下面给出几个简单的表达式:
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。