- 论坛徽章:
- 11
|
starwing83 发表于 2012-06-04 16:20
回复 234# wwwsq
你既然说他的都有道理, 那么这段呢, 你也认为 float average(float array[10]) 不但是不必要的, 也是错误的吗
考察一下下面的样本代码:
#include <stdio.h>
int main( )
{ float average(float array[10]);
float score[10],aver;
int i;
printf("input 10 scores:\n");
for(i=0;i<10;i++)
scanf("%f",&score);
printf("\n");
aver=average(score);
printf("average score is%5.2f\n",aver);
return 0;
}
float average(float array[10])
{ int i;
float aver,sum=array[0];
for(i=1;i<10;i++)
sum=sum+array;
aver=sum/10;
return(aver);
}
复制代码
————谭浩强 ,《C程序设计》(第四版),清华大学出版社,2010年6月,p194
首先看main()函数,其中的“aver=average(score);”一句是main()函数要求average()函数求出数组score各个元素的平均值并返回,然而实参只有一个score,而score在这里表示的仅仅是指向数组score首个元素的指针,并不代表整个数组。也就是说main()函数并没有提供给average()函数进行计算的必要条件。这等同于老板要员工完成项目但却不提供必要的条件。
再看一下average()函数的定义。首先,形参类型声明“float array[10]”中,“[]”内的那个10不知所云,是完全多余的,毫无必要。可能有人认为写这个10并没有编译错误,因为编译器会忽视这个10。可问题是,既然这个10对编译及程序没有任何效用,为什么要写上这个10呢?如果要写一个函数求两int类型数据的和,是否会有人写成下面那样呢?
int sum ( int a, int b ,int c)
{
return a + b ;
}
复制代码
这个函数同样没有编译错误,但人人都知道那个形参c是可以没有的。可以没有的就是并不需要的,并不需要的就是多余的,多余的就是错误的。函数定义中“[]”内的那个10和这段代码中的“c”就“多余”这点来说,没什么两样。因而,average()函数定义形参类型声明应该写为“float array[]”。这表示函数计算的依据是一个由实参传来的指针。 |
|