C语言函数的调用

C语言函数的调用,第1张

函数fun(int a,int b)仅仅是完成了形参a和b的交换,

交换的结果并不改变实参c[i]和c[i+1],作如下修改

#include<stdioh>

void fun(int a,int b)

{

int t ;

t=a;a=b;b=t;

}

main()

{

int c[10]={1,2,3,4,5,6,7,8,9,0},i;

for(i=0;i<10;i+=2) fun(&c[i],&c[i+1]);

for(i=0;i<10;i++) printf("%d",c[i]);

printf("\n");

}

函数的调用就是先定义一个函数,然后在需要使用的时候调用它,具体怎么定义,怎么调用不同开发语言有不同细微差别。

函数调用时, 第一步,prefixexp 和 args 先被求值。 如果 prefixexp 的值的类型是 function, 那么这个函数就被用给出的参数调用。 否则 prefixexp 的元方法 "call" 就被调用, 第一个参数是 prefixexp 的值, 接下来的是原来的调用参数

这样的形式

functioncall ::= prefixexp ‘:’ Name args

可以用来调用 "方法"。 这是 Lua 支持的一种语法糖。 像 v:name(args) 这个样子, 被解释成 vname(v,args), 这里的 v 只会被求值一次。

所有参数的表达式求值都在函数调用之前。 这样的调用形式 f{fields} 是一种语法糖用于表示 f({fields}); 这里指参数列表是一个新创建出来的列表。 而这样的形式 f'string' (或是 f"string" 亦或是 f[[string]]) 也是一种语法糖,用于表示 f('string'); 此时的参数列表是一个单独的字符串。

return functioncall 这样的调用形式将触发一次 尾调用。 Lua 实现了 完全尾调用(或称为 完全尾递归): 在尾调用中, 被调用的函数重用调用它的函数的堆栈项。 因此,对于程序执行的嵌套尾调用的层数是没有限制的。 然而,尾调用将删除调用它的函数的任何调试信息。 注意,尾调用只发生在特定的语法下, 仅当 return 只有单一函数调用作为参数时才发生尾调用; 这种语法使得调用函数的所有结果可以完整地返回。

函数调用时, 第一步,prefixexp 和 args 先被求值。 如果 prefixexp 的值的类型是 function, 那么这个函数就被用给出的参数调用。 否则 prefixexp 的元方法 "call" 就被调用, 第一个参数是 prefixexp 的值, 接下来的是原来的调用参数

函数调用时, 第一步,prefixexp 和 args 先被求值。 如果 prefixexp 的值的类型是 function, 那么这个函数就被用给出的参数调用。 否则 prefixexp 的元方法 "call" 就被调用, 第一个参数是 prefixexp 的值, 接下来的是原来的调用参数

C程序的基本单元是函数。函数中包含了程序的可执行代码。每个C程序的入口和出口都位于函数main()之中。main()函数可以调用其他函数,这些函数执行完毕后程序的控制又返回到main()函数中,main()函数不能被别的函数所调用。通常我们把这些被调用的函数称为下层(lower-level)函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。

程序员一般把函数当作“黑箱”处理,并不关心它内部的实现细节。当然程序员也可以自己开发函数库。

说明一点,函数这一节很重要,可以说一个程序的优劣集中体现在函数上。如果函数使用的恰当,可以让程序看起来有条理,容易看懂。如果函数使用的乱七八糟,或者是没有使用函数,程序就会显得很乱,不仅让别人无法查看,就连自己也容易晕头转向。可以这样说,如果超过100行的程序中没有使用函数,那么这个程序一定很罗嗦(有些绝对,但也是事实)。

一、函数的定义

一个函数包括函数头和语句体两部分。

函数头由下列三不分组成:

函数返回值类型

函数名

参数表

一个完整的函数应该是这样的:

函数返回值类型 函数名(参数表)

{

语句体;

}

函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。指针概念到以后再介绍。

函数名在程序中必须是唯一的,它也遵循标识符命名规则。

参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。语句体包括局部变量的声明和可执行代码。

我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。

下面主要介绍无参数无返回值的函数调用。

二、函数的声明和调用

为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。

看一个简单的例子:

void a(); /函数声明/

main()

{

a(); /函数调用/

}

void a() /函数定义/

{

int num;

scanf(%d,&num);

printf(%d\n,num);

}

在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:

main()

{

int num;

scanf(%d,&num);

printf(%d\n,num);

}

可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。)

我们前面已经说了,当定义在调用之前时,可以不声明函数。所以上面的程序和下面这个也是等价的:

void a()

{

int num;

scanf(%d,&num);

printf(%d\n,num);

}

main()

{

a();

}

因为定义在调用之前,所以可以不声明函数,这是因为编译器在编译的时候,已经发现a是一个函数名,是无返回值类型无参数的函数了。

那么很多人也许就会想,那我们何必还要声明这一步呢?我们只要把所有的函数的定义都放在前面不就可以了吗?这种想法是不可取的,一个好的程序员总是在程序的开头声明所有用到的函数和变量,这是为了以后好检查。

前面说了,在调用之前,必须先声明函数,所以下面的做法也是正确的(但在这里我个人并不提倡)。

main()

{

void a();

a();

}

void a()

{

int num;

scanf(%d,&num);

printf(%d\n,num);

}

一般来说,比较好的程序书写顺序是,先声明函数,然后写主函数,然后再写那些自定义的函数。

既然main()函数可以调用别的函数,那么我们自己定义的函数能不能再调用其他函数呢?答案是可以的。看下面的例子:

void a();

void b();

main()

{

a();

}

void a()

{

b();

}

void b()

{

int num;

scanf(%d,&num);

printf(%d\n,num);

}

main()函数先调用a()函数,而a()函数又调用b()函数。在C语言里,对调用函数的层数没有严格的限制,我们可以往下调用100层、1000层,但是在这里我们并不提倡调用的层数太多(除非是递归),因为层数太多,对以后的检查有一些干扰,函数调过来调过去,容易让自己都晕头转向。

某些人可能就不明白了,看上面的例子,好象使用函数后,程序变的更长了,更不让人理解。当然,我举的这个例子的确没有必要用函数来实现,但是对于某些实际问题,如果不使用函数,会让程序变的很乱,这涉及到参数问题。

1、一个函数(function)是一个可以从程序其它地方调用执行的语句块。以下是函数定义格式:

type name ( argument1, argument2, ) statement

说明:

type 是函数返回的数据的类型

name 是函数被调用时使用的名

argument 是函数调用需要传入的参量(可以声明任意多个参量)。每个参量(argument)由一个数据类型后面跟一个标识名称组成,就像变量声明中一样(例如,int x)。参量仅在函数范围内有效,可以和函数中的其它变量一样使用, 它们使得函数在被调用时可以传入参数,不同的参数用逗号(comma)隔开

statement 是函数的内容。它可以是一句指令,也可以是一组指令组成的语句块。如果是一组指令,则语句块必须用花括号{}括起来,这也是我们最常见到情况。其实为了使程序的格式更加统一清晰,建议在仅有一条指令的时候也使用花括号,这是一个良好的编程习惯。

2、示例:每一个C语言程序有且只有一个main函数,本身main就是一个函数。

int main()

{

return 0;

}

呵呵!楼主的程序的写法让人看了蛋疼,先帮你美化美化!

#include <stdioh>

long f1(int p)

{

int k;

long r;

long f2(int);

k=pp;

r=f2(k);

return r;

}

long f2(int q)

{

long c=1;

int i;

for(i=1;i<=q;i++)

c=ci;

return c;

}

main()

{

int i;

long s=0;

for (i=2;i<=3;i++)

s=s+f1(i);

printf("\ns=%ld\n",s);

}

看一个代码肯定是从main函数看起的。首先main调用了f1,然后f1又调用了f2;

观察f2发现,其实f2(q)就是用来求q的阶乘q!的!所以可进一步观察出f1(p)是用来求(pp)的阶乘的!

返回到main函数,所以s=4!+9!;

呐,这就是调用函数的过程。

#include <stdioh>

#include <mathh>

//判断是否为素数的函数

int isPrime(int n)

{

    int i=2;

    while(i<=(int)sqrt(n))

    {

        if(n%i == 0)

            return 0;  //不是素数,直接返回0

        else

            i++;

    }

    return 1;

}

int main()

{

    int n,i;

    printf("输入一个正整数: ");

    scanf("%d",&n);

    for(i=2;i<=n;i++)

{

if(isPrime(i))  //调用函数,如果该数为素数,则输出

printf("%d ",i);

}

printf("\n");

    return 0;

}

示例运行结果:

输入一个正整数: 50

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

第一题:求类似斐波那契数列中的第n个数

先来看下什么是斐波那契数列:

指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N)

数列中的每个数,都等于前两个数字之和。第一数和第二数规定为1

回到图中的程序,n<=2时,返回2,那么就是将第一个和第二个数规定为2。

即:

fib(1)=2, fib(2)=2

根据公式:

fib(3) = fib(1)+fib(2)=2+2=4

代码的用递归实现,若不懂递归,可google之或百度之。

第二题:

main函数里的变量a,b,c都没有用上,迷惑你用的。回到d

d=f(f(3,4), f(3,5))

再看f这个函数

f(3,4) = f(x,y)=(y-x)x=(4-3)3=3

f(3,5) = (5-3)3=6

因此,d=f(f(3,4), f(3,5))=f(3,6)=(6-3)3=9

第三题 这个函数里面的赋值写法我还没见过,容我再想想。

函数调用是指:简单来讲,假如小明是班长,小红是本班的生活委员,小明要想收班费,但每个人都有不同的职责,而班长是用来组织和统筹工作的,而作为生活委员的小红的职责之一就是收取和管理班费,所以这样的话,小明只需让小红去做就行,也就是说只需发出指令给小红就可以了,而小红就是执行这项活动的承担者;在这里小红就相当于被调用函数,小明是调用函数。

函数调用总共有三种方式:

1 函数表达式:

1函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。

2 函数语句:

函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",&b);都是以函数语句的方式调用函数。

3 函数实参:

函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。

注意的是:1假如在你的那句调用语句开始,例如:

#include<stdioh>

int max(int x,int y){

if(x>y||x=y)

return x;

else

return y;

}

void main(){

int a,b;

scanf("%d%d",&a,&b) ;

printf("%d",max(a,b));

printf("程序结束\n");

}

在这个函数中,我们是在main()函数中用函数实参进行调用的,这样的话。main()函数是一个程序的入口, 在执行 printf("%d",max(a,b)); 这条语句的max(a,b)时候,开始转到max(int,int)函数中执行,执行完后在回到printf("%d",max(a,b)); 进行输出a,b中的最大值,然后再接着执行main()函数的剩下语句 printf("程序结束\n");推出程序。但我们调用的时候,main()函数(即调用函数)需要给被调用函数提供必要的具体数据,即x,y的值。所以表达式max(a,b)即把a的值赋给x,b的值赋值给y;如此执行下去。

即若输入 3 4

程序结果为: 4 程序结束

2还是上面的那个例子,若int max(int x,int y)在main()函数的下面,要调用的话,就需要在main()函数之前进行声明,声明格式为: 函数返回值类型 函数名 (形参类型1 形参名1,形参类型2 形参名2);其中分号不可少,形参名可以省去,但是形参类型和返回值类型均不可省!!!如下所示:

#include<stdioh>

int max(int x,int y); //函数声明1

或者int max(int ,int ); //函数声明2

void main(){

或者 int max(int x,int y); //函数声明3

或者int max(int ,int ); //函数声明4

int a,b;

scanf("%d%d",&a,&b) ;

printf("%d",max(a,b));

printf("程序结束\n");

}

int max(int x,int y){

if(x>y||x=y)

return x;

else

return y;

}

函数声明的作用是让调用函数认识被调用函数,这样才可以想被调用函数发送指令!

至于为什么用调用这个名字,个人觉得这个是因为很贴切吧,便于理解!!!

你明白了吗?不明白可以追问哦!希望采纳哦!

以上就是关于C语言函数的调用全部的内容,包括:C语言函数的调用、程序开发函数调用的方式、函数调用过程是怎么实现的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10136647.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存