小白突然对C语言的函数执行有些不解
能不能给我讲讲C语言的函数执行顺序
回答:
C语言是静态编译~
第一个void f(void);
是告诉编译器:“我的程序接下来要用到函数f()
,但是我现在还不想写它的实现方式,留在最后写,你遇到这个f()
函数的调用,先不要报错,到最后我会告诉你f()
函数怎么实现”
然后main
函数里调用f()
,编译器就知道程序里定义了这个函数
回答:
先了解一下编译原理
回答:
c语言是都是从main函数来执行,当执行到里面第一行时,执行f()函数,这时候会去找f()函数,如果f()函数没有声明直接定义的话,好像得在main()函数之前吧,如果有声明,声明在main函数之前,定义可以随意。只要保证声明在定义前面即可。mian函数的位置和f()函数的定义位置无关,只要找的到即可。我是这么理解的。好久没学C了。
回答:
函数的定义是顺序无关的,编译后的执行程序永远都会先从main函数进去,这是程序的入口
回答:
画了张图,结合上面的答案理解理解吧。。
对c
程序来说,如上面所说是编译生成二进制的可执行程序,当执行的时候其实一切都是准备好的了,所以不会出现你说的f
还没出来无法执行的问题
对其他语言来说就算附近没有找到f
的定义,我们可以使用其他方法寻找,总之 不会跳过f
去执行其他的,这个逻辑是不会变的
回答:
补充两点原因吧:
C 语言是强类型的语言,所有函数和变量都要先定义后使用。但是当多人分工合作的时候有可能用到别人定义的函数。这个时候编译器就无法知道这个函数的类型,无法在编译的时候检查调用是否正确。
所以就在自己的代码了写一个声明,表示这个函数会在有定义,它的定义类型是这个样子。这样就编译器就能检查函数类型和留下合适的代码处理参数传递。
C 语言是一个比较古老的语言。。。在那年代哪有人敢乱用内存,所以编译器只会扫描一遍代码。即使在同一个文件里定义,虽然你后面定义了f
,但是编译到main
的时候编译器是不知道后面定义了 f
的,所以需要在前面写一个声明,这样编译器才会知道这个函数的类型,检查调用方式是否正确,以及编译main
的时候就编译出调用f
的代码。而不用等找到f
之后再回来修改此处代码(而且这种修改可能会导致其他地方的修改)。
如今这个年代,许多语言都是支持,如果写在一个文件里,函数定义是可以写在后面而前面不需要声明的。
以上是 小白突然对C语言的函数执行有些不解 的全部内容, 来源链接: utcz.com/p/194675.html