C语言 函数调用 如果没进行声明会怎么样?
假设主函数main()。其他函数void fun(int a,int *b)。
关于函数定义和声明:
在代码中fun函数,有完整函数体的代码就是函数定义部分,比如void fun(int a,int *b){。。。};。
如果没有具体实现的函数体代码(也就是大括号内容),那么就是函数声明。比如void fun(int ,int *);
关于函数声明和调用:
如果fun函数定义在main代码上面。比如:
void fun(int a,int *b){。。。};
int main(){
int a=0,int b=0;
......
fun(a,&b);//这里fun定义代码在main上面,所以可以不需要声明。反之需要先写声明语句
return 0;
}
关于函数局部变量及全局变量:
简单区分:
定义在函数之外的就是全局变量,这个变量所有函数都可以直接使用,并且共用同一个地址。任意函数修改了变量值,其他函数调用也会变。
定义在函数之内的就是局部变量,局部变量只属于该函数,其他函数即使定义了同样名字的变量,这两个变量也不同地址,互不相干。
比如:
int a;//这就是全局变量,作用域下所有函数共用
int main()
{
int b;//这就是局部变量,只在本函数有效,如果想在调用fun函数时让fun也使用该变量,需要把这个变量的地址作为参数传递过去。
printf("%d",b);
return 0;
}
注意:c语言中允许局部变量和全局变量同名,但是同名的局部变量会屏蔽全局变量,实际代码避免同名。
关于函数传值和传址:
如函数void fun(int a,int *b){..........};这里形参a 和*b,分别表示一个值和一个地址
所以在调用该函数时,比如:
int main()
{
int c,d;
fun(c,&d);//这里调用就对应上面形参类型,第一个参数传递了c的值(传值),第二个参数传递了d的地址(传址),这里c和&d,叫做实参。当fun函数运行时改变了a和b指向地址的值,对应main函数中c的值不变,d的值改变。
return 0;
}
顺带一说:局部变量,在函数运行结束后会自动释放,所以想把局部变量地址作为返回值,需要用malloc函数申请。(这里看不懂可以暂时忽视)
会的,当你运行时,编译器还要检查你的函数是否有格式或其它错误!
1、由于程序是顺序执行,如果没有提前声明,程序会找不到函数,于是报错。2、声明的主要作用是告诉程序我下面要用到这个函数,程序会去找这个函数的定义,然后调用。
3、也可以把nt max(int x,int y)放到main函数之前,就不用写声明了。
声明就是告诉编译器 有这个函数 如果再调用前没有声明,同时函数定义在调用后的话,编译器则提示调用了未定义的函数。
不写也没关系吧..你把那行去掉,试试不就行啦。这种问题还是自己先调试一下比较好吧
不好意思,C不熟
C语言规定,标识符必须先声明后引用。引用未经声明或者类型(如果有的话)和声明不符的标识符属于语法错误。函数名是描述有类型对象的标识符,函数调用是对函数名的引用,因此函数调用之前必须声明,否则编译器会报错。
但是要注意,函数的定义本身即包含了声明。而编译器对于一个编译单元(已经经过预处理)内的编译顺序是自前向后的,因此结论是如果调用之前函数已经定义,那么不用写额外的声明(要是再次声明的话,只要函数参数列表类型和定义的一致,也不会引起编译错误);如果定义的函数体在调用之后,那么必须先声明才能调用。
另外的一种情况是,函数的定义不在源文件而在外部库文件中,这时调用前也需要先声明(C标准库头文件里面有这样的声明)。
注意一旦声明,就必须要有定义。否则编译过程的最后链接器会报错,提示未解析的引用(也就是“找不到定义”)。
从编译的角度来说,声明是对编译器的提示,使编译器在解析标识符引用时类型验证等语法检查工作不必搁置起来占用内存,或者在后续代码中查找定义消耗额外时间。这点对于早期硬件条件吃紧的环境下的编译效率有重要意义。但是随着硬件条件的改善,这个特性的优势已经变得不是那么明显,反而加重程序员的负担。相对于C/C++,一些更“现代”的类C语言(Java、C#、D语言等)中不再有“先声明后引用”的限制。
====
[原创回答团]
甫阮通脉: 1、由于程序是顺序执行,如果没有提前声明,程序会找不到函数,于是报错. 2、声明的主要作用是告诉程序我下面要用到这个函数,程序会去找这个函数的定义,然后调用. 3、也可以把nt max(int x,int y)放到main函数之前,就不用写声明了.
阳谷县17032324978: C语言 函数调用 如果没进行声明会怎么样??
甫阮通脉: 不写的话,当系统调用函数 时,如果没有对函数进行声明,那么编译系统无法确定max是不是函数名,也无法判断实参与形参的类型和个数是否正确,因而无法进行正确性检查.如果不做检查,在运行时才发现实参与形参的类型或个数不一致,...
阳谷县17032324978: C语言中,自己写的函数只定义不声明可不可以调用 - ?
甫阮通脉: 先定义后调用,如果后定义就必须先声明
阳谷县17032324978: c 里的函数可否不声明 直接在main()后面使用? - ?
甫阮通脉: 函数未先声明,直接在main中使用,在Turbo C 2.0,Borland C++编译是可以通过的,不过这样不是良好的编程习惯,建议:1. 将函数移到main之前;2. 在main之前声明,在main之后再为函数代码.对于较大的代码,函数多,相互之间存在各种引用,为了便于阅读、管理,减少错误,强烈建议采用第2种方式,这是一种良好的编程习惯.而且现在很多编译器对于函数未先声明,直接使用会给出警告或错误.
阳谷县17032324978: C语言中调用函数为什么写在主函数的前面? - ?
甫阮通脉: 因为在C程序的执行总是从main函数开始的,无论main函数在哪个位置都肯定从它开始,如果你定义的函数在main函数之后而且在main函数前没有进行该调用函数的声明那么当在main函数中调用的该函数系统将不认识他,会有错误提示的,如果你定义的函数在main函数之前,那么就没事了,说的有点乱,总之记住C程序中总是从main函数开始执行就明白了
阳谷县17032324978: C语言中什么情况下不必为函数进行声明??举个具体例子【重点】 - ?
甫阮通脉: 以上例子就是:把要被调用的函数放在调用函数之前,可以不用声明;或者用库函数也不要你声明,并且也不可以声明.
阳谷县17032324978: 为什么我用C语言在使用函数时不用声明也可以?在用返回值时,不写return也可以? - ?
甫阮通脉: 编译器问题,比如VC6.0,函数定义在使用之前,不用声明也可以直接使用 如果函数定义成有返回值,不return有些编译器只是警告,所以可以通过
阳谷县17032324978: C语言调用函数必须申明吗?
甫阮通脉: 自定义函数写在main函数前面,可以不申明.自定义函数写在main函数后面,要调用就必须要声明.
阳谷县17032324978: C语言中,在调用函数后定义不必声明的例子 - ?
甫阮通脉: 只要将自己定义的函数放在主函数之前,就可不用声明
阳谷县17032324978: 在编辑c程序时,在函数调用那块,为什么有的不在main前声明会报错?有的不可通过? - ?
甫阮通脉: 这是编译器的设置问题,有的编译器会自动把没有声明的函数声明成int类型.有的则是不允许通过.通过修改编译选项就可以达到想要的效果