我试图通过K& R来了解C.我无法理解本书中的两个函数的代码:
void qsort(int v[], int left, int right){
int i, last;
void swap(int v[], int i, int j);
if (left >= right)
return;
swap(v, left, (left+right)/2);
last = left;
for ( i = left+1; i<=right; i++)
if (v[i]<v[left])
swap(v,++last, i);
swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}
void swap(int v[], int i, int j){
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
这两个函数对给定数组执行快速排序。在main函数中,我创建了一个int数组并调用了qsort。它编译得很好并且运行良好。我的问题是,为什么swap()的原型放在函数qsort()而不是main()之前?
答案 0 :(得分:5)
您编写一个函数原型,以便编译器知道该函数存在,并可以使用它。 swap()
在qsort()
内使用,因此它必须出现在使用它的行之前。在这种情况下,swap()
原型在qsort()
函数内声明,但也可以在函数本身之前声明。或者您可以在swap()
之前定义qsort()
并删除原型。
答案 1 :(得分:5)
原型应该在第一次使用实际功能之前添加。
在这种情况下,我不认为在qsort()
函数中使用原型是一般的做法,但是,它仍然有用。 swap()
的原型也可以在main()
之前添加,不要认为它会有所作为。
答案 2 :(得分:1)
将函数原型放置在其他函数的定义中将强制执行以下原则: 通过将适当的函数调用限制在出现原型的函数上,从而获得最低特权。