企业网站的设计论文,韩国ps教程网站,客户管理软件 crm,怎样加入好大夫网站做医生有时候会因为不注意递归函数中局部变量和全局变量#xff0c;而导致结果和我们期望的不一致#xff0c;递归中#xff0c;在递归中的局部变量和全局变量#xff0c;可以类似的看成函数调用时传递方式的按值传递#xff08;局部变量#xff09;和引用传递#xff08;全局…有时候会因为不注意递归函数中局部变量和全局变量而导致结果和我们期望的不一致递归中在递归中的局部变量和全局变量可以类似的看成函数调用时传递方式的按值传递局部变量和引用传递全局变量 局部变量可以看成两个值即虽然名字相同但每次递归时是重新创建的变量不会覆盖掉上次创建的值类似形参与实参不同 全局变量每一次对于全局变量进行操作就会改变它的值。 看下面两个简单的程序看它们的运行结果
程序一
#include stdio.h
void f()
{char x;scanf(%c,x);if(x*){printf(%c,x);}else{f();printf(%c,x);}return;
}
int main()
{f();return 0;
}输入样例
abc*
输出样例
*cba
程序2
#include stdio.h
char x;
void f()
{scanf(%c,x);if(x*){printf(%c,x);}else{f();printf(%c,x);}return;
}
int main()
{f();return 0;
}
输入样例
abc*
输出样例 由上面两个程序可以看出它们定义的变量是不一样的第一个函数的变量x是局部变量而第二个程序的变量x是全局变量这就导致了它们的输出结果不一样。
分析程序1 上面是进入函数f( )后的运行过程刚开始输入xaif为假再次调用f( )函数再次输入xb以此类推下去到最后if为真时输出x *再返回输出xc以此类推下去最后的到的结果是 *cba。
而由于变量x是局部变量存放在内存的栈区属于动态存储类别, 占动态存储区空间函数调用结束后自动释放。 如看上面的流程图1当第⑤执行后则第四个框内的数据都会被系统回收x的值就看第三个框变为c以此下去直到结束。所以最后的结果并不会跟程序2的结果一样输出****。
分析程序2 程序2中的自定义函数f( )与程序1的执行过程差不多只是变量x变成了全局变量。全局变量存放在内存中的静态区在该区的数据只有在程序全部执行完之后才会被释放。
看上面的流程图2x是全局变量所以x放在了静态区里面每次激活函数f( )后输入的x的值会覆盖前一个x的值当程序执行到第⑤步执行后x的值并不会像程序1那样被系统回收它会保留下来当函数进入第三个框内的时候输出的x依然是*,以此推下去。因此程序会输出****。