能正确编译的代码
#include"stdio.h" int n1[10]={0},n2=0; float average(float a[][5],int i) { float sum=0; int j; for(j=0;j<10;j++) sum+=a[j][i]; return(sum/10); } main() { float score[10][5],avg[5]; char name[10][10],subject[5][10]={"语文","数学","英语","物理","化学"}; int i,j; for(i=0;i<10;i++) { printf("请输入%d号同学的姓名:",i+1); gets(name[i]); printf("请分别输入语文、数学、英语、物理、化学的成绩:\n"); for(j=0;j<5;j++) { scanf("%f",&score[i][j]); } printf("\n"); getchar(); } printf("这五门课的平均分为:\n"); for(i=0;i<5;i++) { printf("%s\t",subject[i]); avg[i]=average(score,i); printf("%.2f\n",avg[i]); } findtop(score); printf("最高分数对应的同学和课程是:%s\t%s",name[n2],subject[n1[0]]); } findtop(float a[][5]) { int i,j; float temp; for(i=0;i<10;i++) { for(j=1;j<5;j++) { if(a[i][0]<a[i][j]) { a[i][0]=a[i][j]; n1[i]=j; } } } for(i=1;i<10;i++) if(a[0][0]<a[i][0]) { a[0][0]=a[i][0]; n2=i; n1[0]=n1[i]; } }
不能正确编译的代码
#include"stdio.h" int n1[10]={0},n2=0; main() { float score[10][5],avg[5]; char name[10][10],subject[5][10]={"语文","数学","英语","物理","化学"}; int i,j; for(i=0;i<10;i++) { printf("请输入%d号同学的姓名:",i+1); gets(name[i]); printf("请分别输入语文、数学、英语、物理、化学的成绩:\n"); for(j=0;j<5;j++) { scanf("%f",&score[i][j]); } printf("\n"); getchar(); } printf("这五门课的平均分为:\n"); for(i=0;i<5;i++) { printf("%s\t",subject[i]); avg[i]=average(score,i); printf("%.2f\n",avg[i]); } findtop(score); printf("最高分数对应的同学和课程是:%s\t%s",name[n2],subject[n1[0]]); } float average(float a[][5],int i) { float sum=0; int j; for(j=0;j<10;j++) sum+=a[j][i]; return(sum/10); } findtop(float a[][5]) { int i,j; float temp; for(i=0;i<10;i++) { for(j=1;j<5;j++) { if(a[i][0]<a[i][j]) { a[i][0]=a[i][j]; n1[i]=j; } } } for(i=1;i<10;i++) if(a[0][0]<a[i][0]) { a[0][0]=a[i][0]; n2=i; n1[0]=n1[i]; } }
为什么本人自定义函数average定义位置不一样(正确的在主函数前,错误的在主函数后),编译结果会不一样(一个是正确编译,另一个编译错误
33 7 E:\学习\C语言程序设计\作业\第八次\201505025flh3.c [Error] conflicting types for "average" 26 10 E:\学习\C语言程序设计\作业\第八次\201505025flh3.c [Note] previous implicit declaration of "average" was here
)
但是本人把编译错误代码里的函数类型由float 改为int后又能正确编译。求高手解答谢谢了
解决方案
20
假如是在 main 函数之后进行函数定义的,那么调用时就一定要在 main 函数之前进行声明。
假如在自定义函数在 main 函数之前定义的,就可以不需要进行声明,main 函数能够自动找到该函数。
即使没有前向声明有的编译器也支持,能通过编译。
所以最好都加上前向声明。
假如在自定义函数在 main 函数之前定义的,就可以不需要进行声明,main 函数能够自动找到该函数。
即使没有前向声明有的编译器也支持,能通过编译。
所以最好都加上前向声明。
5
函数在使用前要声明,第二此没有声明
5
C/C++ 是按顺序执行编译 而且假如你使用的函数 在是使用的时候 没有函数声明就会报错,编译完,然后链接
假如没有定义就报link错误
假如没有定义就报link错误
5
假如你要在A函数中调用B函数,那么你要把B函数放于A函数前,或B函数放在后但在A函数前面加上声明
5
原因是你需要在主函数使用前对你自定义的函数进行定义,假如你希望在后边进行定义,那至少要有对其进行声明的操作。
如:
如:
#include <stdio.h> //在主函数前对求和函数进行定义 int DoAdd(int x, int y) { return x+y; } //在主函数前对求二者较大数的函数进行声明,其实现/定义部分在后面进行 int MaxFunc(int x, int y); int main() { int x = 1; int y = 2; printf("The sum of x and y is %d.\n",DoAdd(x,y)); printf("The max between x and y is %d.\n",MaxFunc(x,y)); return 0; } //对求二者中较大数函数的定义/实现 int MaxFunc(int x, int y) { return x>y ? x : y; }
10
1)定义也是声明
2)先声明,后使用
假如一个函数,全局变量,类型 定义在函数前面,那么可以直接使用,原因是定义也是声明。
否则,必须先声明(前置声明),后使用。
类型定义–struct.union,class( 仅仅 C++) 等–,
原因是涉及到该类型占用内存大小的原因,和变量声明,函数声明,有所不同
用类型 定义指针,引用,不需要 先定义类型,只需要先声明(前置声明)即可
用类型定义变量,(包括数组)需要类型先定义,然后才可以定义变量。
struct.union,class 等,也可以定义类型同时定义变量
2)先声明,后使用
假如一个函数,全局变量,类型 定义在函数前面,那么可以直接使用,原因是定义也是声明。
否则,必须先声明(前置声明),后使用。
类型定义–struct.union,class( 仅仅 C++) 等–,
原因是涉及到该类型占用内存大小的原因,和变量声明,函数声明,有所不同
用类型 定义指针,引用,不需要 先定义类型,只需要先声明(前置声明)即可
用类型定义变量,(包括数组)需要类型先定义,然后才可以定义变量。
struct.union,class 等,也可以定义类型同时定义变量