Code Bye

关于函数类型声明问题

能正确编译的代码
#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 函数能够自动找到该函数。
即使没有前向声明有的编译器也支持,能通过编译。
所以最好都加上前向声明。

5

函数在使用前要声明,第二此没有声明

5

C/C++ 是按顺序执行编译 而且假如你使用的函数 在是使用的时候 没有函数声明就会报错,编译完,然后链接
假如没有定义就报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 等,也可以定义类型同时定义变量

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于函数类型声明问题