www.gsyw.net > 为什么“C语言既可以嵌套定义又可以递归调用”是错的?

为什么“C语言既可以嵌套定义又可以递归调用”是错的?

C语言可以递归调用,但是(函数)不能嵌套定义.例如:int fact(int n) { if (n == 0) return 0; else return n * fact(n - 1); }图中的递归调用是允许的.而:void foo() { void bar() { // Some code } }这样在函数内定义函数是不允许的.不过结构体是可以嵌套定义的,例如:struct test { int a; struct demo { char b; }; };这样在结构体内定义结构体,是可以的.

不可以嵌套定义的,只能递归调用

有些语言函数可以嵌套定义,有些不可以 大多数语言都可以函数递归调用 如果有指针之类的东西,是可以形参改变实参的

PL/0 语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储管理.(数组 CODE 存放的只读目标程序,它在运行时不改变.)运行时的数据区 S 是由解释程序定义的一维整型数组,解释执行时对数据空间 S 的管理遵循后进先出规则,当每个过程包括主程序被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放.应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题.

区别:函数嵌套是语言特性,递归调用是逻辑思想.这两者有关,但并不互斥.一个递归过程可以包含函数嵌套.同样,一个递归函数也可当做是自身嵌套函数.函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数:func1(){ func2();}

递归是属于算法,结构体是一个数据结构.算法的实现是利用解决问题的思路加上数据结构来使用的.简单来说就是递归像是动作,而结构体是这个动作涉及到(也可能涉及不到)的一个物体

所谓递归函数是在函数fun中调用fun函数,而写成fun(fun(x))是属于嵌套调用,相当于:a=fun(x);fun(a);

可以嵌套:#define a bb(不能是aa)#define bb 123预编译时a会变为123不可递归:#define c 1+c或#define c 1+b#define b 1+c预编译时c会变成1+1+1+1+1+无限循环

你的程序本身没错的,只是多了一些东西“》》”将它删除就可以运行了.

都是通过栈来实现的,为了支持函数调用,编译器必需要建栈.没有栈的编译器无法支持函数调用实际上编译器无法区分是否是递归函数,它只不过是按代码顺序执行,到达return fib(n-1)+fib(n-2);时实际已经经过了int fib(int n),相当于编译器已经得知这个函数是存在的,所以没有问题可以调用.不管是不是递归函数,函数入栈都是在编译时完成的

网站地图

All rights reserved Powered by www.gsyw.net

copyright ©right 2010-2021。
www.gsyw.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com