我是初学者,如果我超越任何规则,请道歉。这是我的问题。
我在Codeblocks上使用GCC编译器,我注意到了一些特殊的代码片段。我希望有人可以对此有所了解。
int main()
{
Tree *t;
//some operations on the tree
traverse();// No parameter is passed here.
...
}
void traverse(Tree *t)
{
..
}
在以下代码中,函数traverse()正确执行。我的问题是为什么?我不确定这一点,但如果未声明函数,则其默认类型为int。现在,编译器不仅在编译时抑制了错误,而且还正确地将参数't'提供给函数traverse()。
这是因为智能编译器设计吗?
所以一般来说:我遇到的问题是 - 如果遇到尚未声明的方法,编译器会默认采取什么行为?更重要的是,它如何“知道”我想传递哪个参数?
如你所知,我可以有三个“Tree *”实例:t1,t2和t3。编译器会通过哪一个?
我尝试在谷歌上四处寻找,但尚未找到明确的来源。
感谢您的时间。 :)
答案 0 :(得分:3)
该函数正在堆栈中查找其参数。该函数不知道它所期望的参数实际上并不存在。
偶然地,它正在寻找参数的堆栈上的东西是t
函数中的局部变量main()
。如果你在main()
中有更多的局部变量,那么其中一个会被误解为函数的参数,事情就会出错了。
所以,它纯粹是偶然的。