通常在C语言中,一个完整的项目程序是不可能在一个函数中实现所有的功能。而是由若干功能不同的函数来实现,并且函数之间会存在互相调用的情况。
函数是C语言的基本组成元素,如果你要想实现函数的功能,那么你就必须学会正确调用函数。当我们调用一个函数时,需要明确函数名和实参列表。实参列表中的参数可以是常量、变量、表达式或者空,并且各参数之间要使用英文逗号分隔开来。
在数学运算中,会遇到计算多个连续自然数之间的和的情况。例如要计算1~n之间自然数之和,就需要先计算1加2的结果,用这个结果加3再得到一个结果,用新得到的结果加4,以此类推,直到用1~(n-1)之间所有数的和加n。
在程序开发中,要想完成上述功能,就需要使用函数的递归调用,所谓的递归调用就是函数内部调用自身的过程。需要注意的是,递归必须要求有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。接下来通过一个计算自然数之和的案例来学习递归调用。
扩展资料
在C++中,为了允许 *** 作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器。
这项技术通常被称为名称改编(Name Mangling)或者名称修饰(Name Decoration)。许多C++编译器厂商选择了自己的名称修饰方案。
函数调用就是运用已经声明好的函数,为了允许使用函数的副作用, 函数调用可以被作为一个语句
1在这种情况下,所有的返回值都被舍弃。局部变量可以在语句块中任何地方声明。 声明可以包含一个初始化赋值 *** 作
如果有初始化值的话,初始化赋值 *** 作的语法和赋值 *** 作一致 。 若没有初始化值,所有的变量都被初始化为 nil。
一个代码块同时也是一个语句块, 所以局部变量可以放在代码块中那些显式注明的语句块之外。局部变量的可见性规则
3数字和字面串在 中解释; 变量在 中解释; 函数定义在 中解释; 函数调用在 中解释; 表的构造在 中解释。 可变参数的表达式写作三个点(''), 它只能在有可变参数的函数中直接使用;这些在 中解释。
二元 *** 作符包含有数学运算 *** 作符(1), 位 *** 作符, 比较 *** 作符(), 逻辑 *** 作符), 以及连接 *** 作符)。 一元 *** 作符包括负号(), 按位非(), 逻辑非(), 和取长度 *** 作符(§)。
4函数调用和可变参数表达式都可以放在多重返回值中。 如果函数调用被当作一条语句(), 其返回值列表被调整为零个元素,即抛弃所有的返回值。 如果表达式被用于表达式列表的最后(或是唯一的)一个元素, 那么不会做任何调整(除非表达式被括号括起来)。 在其它情况下, Lua 都会把结果调整为一个元素置入表达式列表中, 即保留第一个结果而忽略之后的所有值,或是在没有结果时, 补单个 nil。
被括号括起来的表达式永远被当作一个值。 所以, (f(x,y,z)) 即使 f 返回多个值, 这个表达式永远是一个单一值。 ((f(x,y,z)) 的值是 f 返回的第一个值。 如果 f 不返回值的话,那么它的值就是 nil 。
5数字和字面串在 中解释; 变量在 中解释; 函数定义在 中解释; 函数调用在 中解释; 表的构造在 中解释。 可变参数的表达式写作三个点(''), 它只能在有可变参数的函数中直接使用;这些在 中解释。
二元 *** 作符包含有数学运算 *** 作符(1), 位 *** 作符, 比较 *** 作符(), 逻辑 *** 作符), 以及连接 *** 作符)。 一元 *** 作符包括负号(), 按位非(), 逻辑非(), 和取长度 *** 作符(§)。
6函数调用和可变参数表达式都可以放在多重返回值中。 如果函数调用被当作一条语句(), 其返回值列表被调整为零个元素,即抛弃所有的返回值。 如果表达式被用于表达式列表的最后(或是唯一的)一个元素, 那么不会做任何调整(除非表达式被括号括起来)。 在其它情况下, Lua 都会把结果调整为一个元素置入表达式列表中, 即保留第一个结果而忽略之后的所有值,或是在没有结果时, 补单个 nil。
被括号括起来的表达式永远被当作一个值。 所以, (f(x,y,z)) 即使 f 返回多个值, 这个表达式永远是一个单一值。 ((f(x,y,z)) 的值是 f 返回的第一个值。 如果 f 不返回值的话,那么它的值就是 nil 。
程序。函数调用是计算机编或运行时,使用某个函数来完成相关命令,作用是使程序转向被调用的函数,执行被调函数,完成被调函数的功能。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
如果在设计c语言程序中,反复要用到一个组合计算的程序段,比如:
void main()
{
int a,b,c,x,y,z,j,k,l;
c=a+b; c-=(a-b)/2; //计算c=(a+b)-(a-b)/2
z=x+y; z-=(x-y)/2; //计算z=(x+y)-(x-y)/2
l=j+k; l-=(j-k)/2; //计算l=(j+k)-(j-k)/2
}
由于它们的计算公式相同,就采用一个函数来替代相似的语句:
int fun(int a,int b) { int c; c=a+b; c-=(a-b)/2; return c; } //按照公式计算并返回结果
这样程序就变成了:
int fun(int a,int b) { int c; c=a+b; c-=(a-b)/2; return c; }
void main()
{
int a,b,c,x,y,z,j,k,l;
c=fun(a,b);
z=fun(x,y);
l=fun(j,k);
}
这样的效果是:重复利用了函数的代码,节省程序的代码量(尤其是计算公式很复杂的情况更突出),程序简洁易读,便于统一修改计算公式和方法。
还有一个优点就是:你调用函数时,无须知道算法的细节,按照函数调用规则就可以使用了,比如,标准c提供的函数double sin(double x),你只要知道这是个计算正弦函数值的函数即可,拿来可用而不必去看具体标准函数库是怎样计算的。
你的函数如果写得正确、经典的话,完全可以封装成标准函数拿给其他人使用,甚至可以不提供源代码就可以。
没有返回值的函数又可以叫子程序
调用函数:编程语言,是计算机编程或运行的时候,使用某个函数来完成相关命令
返回值:一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)