我是初学者,如果我违反了任何规则,请道歉。这是我的问题。
我在 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。那么编译器会通过哪一个呢?
我尝试在 Google 上查找,但尚未找到明确的来源。
该函数正在堆栈中查找其参数。该函数不知道它所期望的参数实际上不存在。
碰巧,堆栈上寻找参数的东西是
t
函数中的局部变量 main()
。如果main()
中有更多的局部变量,那么其中一个变量就会被误解为函数的参数,事情就会变得严重错误。
所以,它的工作纯粹是偶然的。