扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。
创新互联是一家专注于网站设计制作、成都网站制作与策划设计,永登网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:永登等地区。永登做网站价格咨询:18982081108
_cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)是C和C++程序的默认调用约定。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。
_fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈。__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number。
函数是用于执行预定义操作并可选地返回值的子程序。
使用函数,我们可以避免程序中的重复编码,简化并加快程序开发。
C语言提供两种类型的函数:库函数和用户定义函数。
函数的调用
8.4.1 函数调用的一般形式
前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
8.4.2 函数调用的方式
在C语言中,可以用以下几种方式调用函数:
1. 函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。
2. 函数语句:函数调用的一般形式加上分号即构成函数语句。例如: printf ("%d",a);scanf ("%d",b);都是以函数语句的方式调用函数。
3. 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。
【例8.3】
main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}
如按照从右至左的顺序求值。运行结果应为:
8
7
7
8
如对printf语句中的++i,--i,i++,i--从左至右求值,结果应为:
9
8
8
9
应特别注意的是,无论是从左至右求值, 还是自右至左求值,其输出顺序都是不变的, 即输出顺序总是和实参表中实参的顺序相同。由于Turbo C现定是自右至左求值,所以结果为8,7,7,8。上述问题如还不理解,上机一试就明白了。
8.4.3 被调用函数的声明和函数原型
在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
其一般形式为:
类型说明符 被调函数名(类型 形参,类型 形参…);
或为:
类型说明符 被调函数名(类型,类型…);
括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。
例8.1 main函数中对max函数的说明为:
int max(int a,int b);
或写为:
int max(int,int);
C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。
1) 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。例8.2的主函数中未对函数s作说明而直接调用即属此种情形。
2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。例如例8.1中,函数max的定义放在main 函数之前,因此可在main函数中省去对max函数的函数说明int max(int a,int b)。
3) 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。例如:
char str(int a);
float f(float b);
main()
{
……
}
char str(int a)
{
……
}
float f(float b)
{
……
}
其中第一,二行对str函数和f函数预先作了说明。因此在以后各函数中无须对str和f函数再作说明就可直接调用。
4) 对库函数的调用不需要再作说明,但必须把该函数的头文件用include命令包含在源文件前部。
8.5 函数的嵌套调用
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。
图表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
【例8.4】计算s=22!+32!
本题可编写两个函数,一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。主函数先调f1计算出平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,然后返回f1,再返回主函数,在循环程序中计算累加和。
long f1(int p)
{
int k;
long r;
long f2(int);
k=p*p;
r=f2(k);
return r;
}
long f2(int q)
{
long c=1;
int i;
for(i=1;i=q;i++)
c=c*i;
return c;
}
main()
{
int i;
long s=0;
for (i=2;i=3;i++)
s=s+f1(i);
printf("\ns=%ld\n",s);
}
在程序中,函数f1和f2均为长整型,都在主函数之前定义,故不必再在主函数中对f1和f2加以说明。在主程序中,执行循环程序依次把i值作为实参调用函数f1求i2值。在f1中又发生对函数f2的调用,这时是把i2的值作为实参去调f2,在f2 中完成求i2!的计算。f2执行完毕把C值(即i2!)返回给f1,再由f1返回主函数实现累加。至此,由函数的嵌套调用实现了题目的要求。由于数值很大,所以函数和一些变量的类型都说明为长整型,否则会造成计算错误。
在C语言中,函数的使用与编程是密不可分的,下面给大家说说C语言函数的运用和调用?
01
第一步是声明一个函数。 有两种类型的函数,一种是返回值,前者是用int float double char定义的,如int f(int n); 前面的int是返回值类型。
02
参数是函数调用需要传递的参数。 每个参数由一个数据类型和一个标识符名称组成,如变量声明(例如,int x)。
03
参数只在函数的范围内有效,并且可以以与函数中其他变量相同的方式使用。 它们允许函数在调用时传递参数,而不同的参数由逗号分隔。
04
声明是函数的内容。 它可以是一条指令或一条指令。 如果它是一组指令,则语句块必须包含在大括号{}中,这是我们最常见的情况。
错误一、
void strca1(char s1[],char s2[])
{
int i,j; //这里i , j 没的初值,运行结果是不确定的!!加上一句:
i=j=0;
错误二、
char e[20]="aaaa",f[20]="bbbb",*g,*h,*k; //这里g h都是指针,且没有给指定空间位置
g="cccc"; //这里直接向g所指向的位置放数据,就好比,你想往盒子里面放苹果,但你却没有告诉往哪个盒子里放,“cccc"就不知道会存放到哪里了,当g指向了一个不可用的内存地址,程序就会运行错误了!
h="dddd";//同上
改正方法:
char e[20]="aaaa",f[20]="bbbb";
char *g="cccc",*h="dddd",*k; //在定义时这样写是可以的,意思是让g直接指向一个存放"cccc"数据的位置。
请问C语言函数的调用规则是什么,例如主函数main、 函数A 、函数B,这3者的顺序能否打乱,
可以打乱,依个人习惯。
如果 A函数放最前,能否直接调用B函数?还是只能后面的函数调用前面的函数,还是说只要在A函数中声明B函数就能够调用后面的B函数。?
A调B,或B调A都可以,如果B在A后,B可直接调用A,否则,先在B前声明一下A再调用A。
main函数的有没有固定的位置,例如要放最前面?或最后面?
没有要求,一般单独一个C文件放main函数。
我需要程序调用这一部分的 语法描述图,因为规则不是固定,所以画起来有点难度,有没人能提供 程序调用的语法描述图 就是类似 void ---- ident----(----)----{----语句…… 这样的图。加分加分!!
不明白,写两个简单函数实验一下就知道了,这样印象会深刻点不容易忘。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流