当前位置:文档之家› !函数返回值

!函数返回值

!函数返回值
!函数返回值

函数返回值

int Count()

{

int i,j;

i=100;

j=200;

return i+j;

}

测试函数:

void Test()

{

int k=Count();

printf("\n k[%d]\n");

}

C/C++的函数返回值一般是放在寄存器eax里的,而不是在栈里。

你的这一句int k = Count()的汇编语句就是这样:

mov [esp - 4], eax //eax里是300,esp - 4是局部变量k的位置

你可以在vc里做个实验:

int add(int a, int b)

{

__asm {

mov eax,a // 把参数1存入eax

add eax,b // eax += 参数2, 结果在eax里

}

}

int main()

{

printf("%d\n", add(3, 4));

return 0;

}

楼主需要了解下寄存器这一概念,我就不把C/C++函数的汇编代码给发出来了。

还有在汇编层面来看,函数的返回值根本就没有定论,函数可以通过多种方式返回。保存返回值在eax里只是C/C++的一个约定而已。

返回值可以放在栈里,但你在C的语言层面上可能做不到,其实随着函数的结束,mov esp, ebp这条指令过后,函数内部的局部变量就报废了。如果你之后没改变过栈的内容,你可以用栈来存返回值,但比起用寄存器来存储,存储和读取要慢的多。

自己突发奇想在vc下试了下用栈“返回”值,写了段代码:

#include

void __declspec(naked) __stdcall return_a_value()

{

int local;

local = 1990; // 栈空间

__asm ret

}

int main()

{

int local = 1;

return_a_value(); // 用栈返回值

printf("%d\n", local);

return 0;

}

汇编看c之一,简单函数调用

简单的函数调用,通过简单的函数调用反汇编可以清楚了解如下

1.栈到底是什么,如何操纵栈的?

2.参数和临时变量是以什么形式在哪存放?

3.如何传递返回值?

举例:

#include

int add(int a,int b)

{

int c=0;

c=a+b;

return c;

}

int main(void)

{

int x=0;

int y=3;

int z=4;

x=add(y,z);

return 0;

}

这是一个简单的通过调用函数计算两数之和的程序

VC6.0生成的汇编代码如下:

add函数

{

0040D750 push ebp

//把main函数的ebp压栈,ebp=1000,esp=896

0040D751 mov ebp,esp

//得到“新”栈基址,这里的新的意思是每个函数访问属于自己的一块栈区域,其实是相邻的内存区域,或者说栈只有一个。ebp=896,esp=896

0040D753 sub esp,44h

//ebp=896,esp=828

0040D756 push ebx

0040D757 push esi

0040D758 push edi

//ebp=896,esp=816

0040D759 lea edi,[ebp-44h]

0040D75C mov ecx,11h

0040D761 mov eax,0CCCCCCCCh

0040D766 rep stos dword ptr [edi]

//初始化内部变量区

5: int c=0;

0040D768 mov dword ptr [ebp-4],0

//c放入“新”栈基址

6: c=a+b;

0040D76F mov eax,dword ptr [ebp+8]

0040D772 add eax,dword ptr [ebp+0Ch]

//因为“新”栈基地址就是“旧”栈顶地址,所以通过ebp访问传过来的参数,ebp+8到ebp+c是因为ebp上方的8字节用于存储调用函数的调用地址和“旧”堆栈基地址了。

0040D775 mov dword ptr [ebp-4],eax

//运算结果放入c中

7: return c;

0040D778 mov eax,dword ptr [ebp-4]

//用寄存器eax返回结果

8: }

0040D77B pop edi

0040D77C pop esi

0040D77D pop ebx

//恢复寄存器的值,ebp=896,esp=828

0040D77E mov esp,ebp

//恢复“旧”栈顶地址,ebp=896,esp=896,此函数堆栈被释放!

0040D780 pop ebp

//恢复“旧”栈基地址,ebp=1000,esp=900,此时恢复到调用前的栈基地址和顶地址

0040D781 ret

//返回调用点,ebp=1000,esp=904,调用点地址被弹出,返回到调用点

main函数

{

0040D790 push ebp

0040D791 mov ebp,esp

//用栈顶地址作为栈基地址,目的是不和调用前栈空间冲突,为了叙述方便假设此时的栈基址ebp=1000,esp=1000。

0040D793 sub esp,4Ch

//esp下移,开辟出0x4C字节的空间,这个空间是留给内部参数用的,这个空间的大小随内部变量多少由编译器决定。ebp=1000,esp=1000-0x4C=924

0040D796 push ebx

0040D797 push esi

0040D798 push edi

//保护ebx,esi,edi的值,ebp=1000,esp=924-12=912

0040D799 lea edi,[ebp-4Ch]

0040D79C mov ecx,13h

0040D7A1 mov eax,0CCCCCCCCh

0040D7A6 rep stos dword ptr [edi]

//把内部参数占用的空间每个字节都初始化为0xCC,这个是为了在DUBUG程序的方便,编译器加入的,如果不在DEBUG状态下,这个区域是没有被初始化的,也就是说是随机值。

12: int x=0;

0040D7A8 mov dword ptr [ebp-4],0

13: int y=3;

0040D7AF mov dword ptr [ebp-8],3

14: int z=4;

0040D7B6 mov dword ptr [ebp-0Ch],4

//内部变量放入刚才被初始化为0xCC的内部变量区,x占用四字节在地址9996-9999,y,z一次类推

15: x=add(y,z);

0040D7BD mov eax,dword ptr [ebp-0Ch]

0040D7C0 push eax

0040D7C1 mov ecx,dword ptr [ebp-8]

0040D7C4 push ecx

//把参数按照stdcall方式从右到左压栈,ebp=1000,esp=912-8=904,z首先入栈在908-911,y在904-907

0040D7C5 call @ILT+15(_add) (00401014)

//把返回下一行代码即add esp,8 的地址压栈,转向add函数,ebp=1000,esp= 900,看add函数

0040D7CA add esp,8

//ebp=1000,esp=912,恢复到压入参数前栈基地址和顶地址,这个步骤叫做堆栈修正

0040D7CD mov dword ptr [ebp-4],eax

//返回的变量放到x中

16: return 0;

17: }

现在来总结开始提出的三个问题

1.栈到底是什么,如何操纵栈的?

栈是操作系统分配给程序运行的一块内存区域,有以下特点

1.1、改变堆栈用push,pop,用的esp栈顶指针,而读指针则用ebp栈基指针灵活访问

1.2、每当一个函数跳转到另一个函数时,会在上一个函数用到的栈空间下方开辟空间

2.参数和临时变量是以什么形式在哪存放?

2.1、参数放在旧栈的返回地址和旧栈基地址的上方,而临时变量则在新栈的最上方处,变量名会被编译器连接一个地址,程序在被编译成汇编以后,变量名就是虚无了。

3.如何传递返回值?

3.1、传递一个值的情况下,通过eax传递

可以看出,栈溢出是由于编译器没有检查栈是否还有空间。

函数的返回值,16位/32位收藏

同事的一段代码里出现的异常,内存访问错误。遂一起排查。使用的是VC6.0,系统是Win2K。

主调函数func1,传进一个数组的首地址。用数组的下标方式访问,下标是一个子函数func2的返回值。异常出现在这里。一开始怀疑传进来的地址有问题,跟踪下来发现是对的。我怀疑func2的返回值,但看到这个函数很简单,就一句返回一个结构的WORD成员,好象不应该有错。

func2有一个参数,是一个结构指针lp,函数体是return lp->val。函数声明返回WORD类型,结构的成员val也是WORD类型。

在出事地前加了个printf("%x\n",func2(p)),打印func2的返回值。结果说明了出错原因,打印值是1520000。很明显,func2返回了一个DWORD值。访问数组越界,所以异常。

为什么会这样呢?为什么函数返回类型是WORD,使用时却得到一个DWORD值呢?

做了一个尝试,如果把返回值赋给一个WORD类型的局部变量,得到的值是对的;如果加上类型转换(WORD)func2(p)也是对的。

分别看一下这三种情况(一错二对)的汇编码,可以发现,正确的情况,在func1中使用func2的返回值前有一句:

0040B7F2 and eax,0FFFFh //清高16位。

因为在调用func2时,结构指针参数的传递用了32位的eax。func2的汇编码中可以看到,需返回的WORD值放入了16位的ax。所以在func1使用前清高16位,使用的仍然是eax,但值是所需的正确值。

而错误的情况,即不加转换的直接使用,没有这么一句清高位。赋值的时候也没有使用movzx 零扩展指令,直接用mov到eax。

0040B7E6 mov edx,dword ptr [ebp-4]

0040B7E9 push edx

0040B7EA call @ILT+5(_func) (0040100a)

0040B7EF add esp,4

0040B7F2 and eax,0FFFFh //出错的代码没这句。

0040B7F7 push eax

0040B7F8 push offset string "a = %d\n" (00420f74)

0040B7FD call printf (00401090)

0040B802 add esp,8

怀疑是编译器的bug。于是做一个实验。新建一个project,模拟了这个func1和func2。结果的正确的。即使是不加转换的直接使用汇编码里也有清高位,返回的值不会受干扰。更加疑惑。

继续实验。怀疑实际的那个结构有问题。把实际project中的结构移植到实验project中。却也是正确的。

怀疑project的设置有问题。把实验中的结构和函数移植到实际project中,又是正确的。郁闷。

改变此成员在结构中的定义位置,怀疑没有对齐,虽然这不应该是程序员关心的,但也没有发现区别。改变此成员的类型(DWORD,BYTE),都没有找出问题所在。至此,技穷。

希望能找到问题的根源。

本文来自CSDN博客,转载请标明出处:https://www.doczj.com/doc/0715118088.html,/ericzhangali/archive/2004/06/27/27826.aspx

19.1.1《变量与函数》反思

19.1.1《变量与函数》教学反思 本节课是八年级学生初步接触函数的入门课,必须让学生准确认识变量与常量的特征,初步感受现实世界各种变量之间相互联系的复杂性,同时感受到数学研究方法的化繁为简,知道在初中阶段主要研究两个变量之间的特殊对应关系。 函数定义的关键词是:“两个变量”、“唯一确定”、“与其对应”;函数的要点是:1 有两个变量,2 一个变量的值随另一个变量的值的变化而变化,3 一个变量的值确定另一个变量总有唯一确定的值与其对应;函数的实质是:两个变量之间的对应关系;学习函数的意义是:用运动变化的观念观察事物。与学习进行仔细的研究,有助于函数意义的理解,但是,不可能在一课的学时内真正理解函数的意义,继续布置作业:每个同学列举出几个反映函数关系的实例,培育学生用函数的观念看待现实世界,最后,我还说明了,函数的学习,是我们数学认识的第二个飞跃,代数式的学习,是数学认识的第一次飞跃:由具体的数、孤立的数到一般的具有普遍意义的数,函数的学习,是由静止的不变的数到运动变化的数。 在函数概念的教学中,应突出“变化”的思想和“对应”的思想。从概念的起源来看,函数是随着数学研究事物的运动、变化而出现的,他刻画了客观世界事物间的动态变化和相互依存的关系,这种关系反映了运动变化过程中的两个变量之间的制约关系。因此,变化是函数概念产生的源头,是制约概念学习的关节点,同时也是概念教学的一个重要突破口。教师可以通过大量的典型实例,让学生反复观察、反复比较、反复分析每个具体问题的量与量之间的变化关系,把静止的表达式看动态的变化过程,让他们从原来的常量、代数式、方程式和算式的静态的关系中,逐步过渡到变量、函数这些表示量与量之间的动态的关系上,使学生的认识实现 为了快速明了的引出课题,课前让学生收集一些变化的实例,从学生的生活入手,开门见山,来指明本节课的学习内容。本课的引例较为丰富,但有些内容学生解决较为困难,于是我采取了三种不同的提问方式:1.教师问,学生答; 2.学生自主回答; 3.学生合作交流回答。为了较好的突出重点突破难点,在处理教学活动过程中,让学生思考每个变化活动中反映的是哪个量随哪个量的变化而变化,并提出一个量确定时另一个量是否唯一确定的问题,在得出变量和常量概念的同时渗透函数的概念.为了更好的让学生理解变量和常量的意义,由“问题中分别涉及哪些量?哪些量是变化的,哪些量是始终不变的?”一系列问题,在借助生活实例回答的过程中,归纳总结出变量与常量的概念,并能指出具体问题中的变量与常量。函数的概念是把学生由常量数学的学习引入变量数学的学习的过程,学生初步接触函数的概念,难以理解定义中“唯一确定”的准确含义,我设置了以下二个问题:1.在前面研究的每个问题中,都出现了几个变量?它们之间是相互影响,相互制约的。2.在二个变量中,一个量在变化的过程中每取一个值,另一个量有多少个值与它对应?来理解具体实例中二个变量的特殊对应关系,初步理解函数的概念。为了进一步让学生理解“唯一对应”关系,借助函数图像,使学生直观的感受二个变量之间特殊对应关系-----唯一对应。通过这种从实际问题出发的探究方式,使学生体验从具体到抽象的认识过程,及时给出函数的定义。再从抽象转化到实际应用中去,加深学生对函数概念的理解。为了加强学生辨析函数的能力,我准备了一道思考题,Y2=X中对于X的每一个值Y都

!函数返回值

函数返回值 int Count() { int i,j; i=100; j=200; return i+j; } 测试函数: void Test() { int k=Count(); printf("\n k[%d]\n"); } C/C++的函数返回值一般是放在寄存器eax里的,而不是在栈里。 你的这一句int k = Count()的汇编语句就是这样: mov [esp - 4], eax //eax里是300,esp - 4是局部变量k的位置 你可以在vc里做个实验: int add(int a, int b) { __asm { mov eax,a // 把参数1存入eax add eax,b // eax += 参数2, 结果在eax里 } } int main() { printf("%d\n", add(3, 4)); return 0; } 楼主需要了解下寄存器这一概念,我就不把C/C++函数的汇编代码给发出来了。 还有在汇编层面来看,函数的返回值根本就没有定论,函数可以通过多种方式返回。保存返回值在eax里只是C/C++的一个约定而已。

返回值可以放在栈里,但你在C的语言层面上可能做不到,其实随着函数的结束,mov esp, ebp这条指令过后,函数内部的局部变量就报废了。如果你之后没改变过栈的内容,你可以用栈来存返回值,但比起用寄存器来存储,存储和读取要慢的多。 自己突发奇想在vc下试了下用栈“返回”值,写了段代码: #include void __declspec(naked) __stdcall return_a_value() { int local; local = 1990; // 栈空间 __asm ret } int main() { int local = 1; return_a_value(); // 用栈返回值 printf("%d\n", local); return 0; } 汇编看c之一,简单函数调用 简单的函数调用,通过简单的函数调用反汇编可以清楚了解如下 1.栈到底是什么,如何操纵栈的? 2.参数和临时变量是以什么形式在哪存放? 3.如何传递返回值? 举例: #include

函数返回值

函数返回值 1.不带返回值的函数:return; 不带返回值的函数的返回类型为void,这样的函数会在函数的最后一个语句完成时隐式调用return;也可以在函数的结尾显式地调用return; 对于任意一个函数,只要执行了return语句,函数就强制结束了。 对于返回类型为void的函数,如果不显式地调用return;则只有在函数结束时才会隐式调用。可以在函数执行的某一阶段,显式地调用return;来结束函数,不再执行return语句之后的函数部分。 由于break语句只能用于循环和switch语句中,因此,想要结束if语句直接退出函数,可用return; 只有一种情况下,返回类型为void的函数可以使用return expression这一形式,那就是返回另一个返回类型同样是void的函数的调用结果。 如: void A() void B() { { .... .... .... .... return; return A(); } }//因为A返回类型为void,所以可以这样调用。 2.具有返回值的函数:return expression; 代码: int max(int x,int y) #include { int main() int z; { if(x>=y) int a,b,c; z=x; scanf("%d%d",&a,&b); else c=max(a,b); z=y; printf("%d\n",c); return z; return 0; } } 在main函数中调用max函数,函数调用语句为max(a,b); 仔细研究一下max(a,b)。 对于一个表达式来说,它要完成一定的功能,还要返回一个操作结果(即表达式的值)。如i++,它的功能是使变量i的值加1,它的值是i自增前的值。同样的,函数调用也同样如此:max(a,b)的功能是把实参a,b的值传递给形参并执行函数中的各个语句;max(a,b)的值是一个int类型的值。 ++i的值是i自增后的值,相当于i=i+1,return i;对于i++来说,它的值是i自增前的值,那么如何获得这个值呢?编译器是这样做的:编译器自动创建一个临时变量并用i自增前的值来初始化这个临时变量。用这个临时变量的值来作为i++这个表达式的值。 同样的,执行max(a,b)后,首先完成参数传递并执行函数max中的各条语句。接着创建一个int型的临时变量并用return expression中expression的值来初始化这个临时变量。临时变量的类型为函数的返回值类型,即函数名之前的类型名。对max()函数来说就是int。

最新初中函数知识点总结与练习大全资料

考点一、平面直角坐标系 1、平面直角坐标系 在平面内画两条互相垂直且有公共原点的数轴,就组成了平面直角坐标系。 其中,水平的数轴叫做x 轴或横轴,取向右为正方向;铅直的数轴叫做y 轴或纵轴,取向上为正方向;两轴的交点O (即公共的原点)叫做直角坐标系的原点;建立了直角坐标系的平面,叫做坐标平面。 为了便于描述坐标平面内点的位置,把坐标平面被x 轴和y 轴分割而成的四个部分,分别叫做第一象限、第二象限、第三象限、第四象限。 注意:x 轴和y 轴上的点,不属于任何象限。 2、点的坐标的概念 点的坐标用(a ,b )表示,其顺序是横坐标在前,纵坐标在后,中间有“,”分开,横、纵坐标的位置不能颠倒。平面内点的坐标是有序实数对,当b a ≠时, (a ,b )和(b ,a )是两个不同点的坐标。 考点二、不同位置的点的坐标的特征 1、各象限内点的坐标的特征 点P(x,y)在第一象限0,0>>? y x 点P(x,y)在第二象限0,0>?y x 2、坐标轴上的点的特征 点P(x,y)在x 轴上0=? y ,x 为任意实数 点P(x,y)在y 轴上,y 0=?x 为任意实数 点P(x,y)既在x 轴上,又在y ?轴上x ,y 同时为零,即点P 坐标为(0,0) 3、两条坐标轴夹角平分线上点的坐标的特征 点P(x,y)在第一、三象限夹角平分线上?x 与y 相等 点P(x,y)在第二、四象限夹角平分线上?x 与y 互为相反数 4、和坐标轴平行的直线上点的坐标的特征 位于平行于x 轴的直线上的各点的纵坐标相同。 位于平行于y 轴的直线上的各点的横坐标相同。 5、关于x 轴、y 轴或远点对称的点的坐标的特征 点P 与点p ’关于x 轴对称?横坐标相等,纵坐标互为相反数 点P 与点p ’关于y 轴对称?纵坐标相等,横坐标互为相反数 点P 与点p ’关于原点对称?横、纵坐标均互为相反数 6、点到坐标轴及原点的距离 点P(x,y)到坐标轴及原点的距离: (1)点P(x,y)到x 轴的距离等于y (2)点P(x,y)到y 轴的距离等于 x (3)点P(x,y)到原点的距离等于2 2y x + 考点三、函数及其相关概念 1、变量与常量 在某一变化过程中,可以取不同数值的量叫做变量,数值保持不变的量叫做常量。 一般地,在某一变化过程中有两个变量x 与y ,如果对于x 的每一个值,y 都有唯一确定的值与它对应,那么就说x 是自变量,y 是x 的函数。 2、函数解析式 用来表示函数关系的数学式子叫做函数解析式或函数关系式。 使函数有意义的自变量的取值的全体,叫做自变量的取值范围。 3、函数的三种表示法及其优缺点 (1)解析法 :两个变量间的函数关系,有时可以用一个含有这两个变量及数字运算符号的等式表示,这种表示法叫做解析法。 (2)列表法:把自变量x 的一系列值和函数y 的对应值列成一个表来表示函数关系,这种表示法叫做列表法。 (3)图像法:用图像表示函数关系的方法叫做图像法。 4、由函数解析式画其图像的一般步骤:(1)列表:列表给出自变量与函数的一些对应值 (2)描点:以表中每对对应值为坐标,在坐标平面内描出相应的点 (3)连线:按照自变量由小到大的顺序,把所描各点用平滑的曲线连接起来。 考点四、正比例函数和一次函数 1、正比例函数和一次函数的概念 一般地,如果 b kx y +=(k ,b 是常数,k ≠0),那么y 叫做x 的一次函数。

C#多线程函数如何传参数和返回值

C#多线程函数如何传参数和返回值 提起多线程,不得不提起委托(delegates)这个概念. 我理解的委托就是具有同样参数和返回值的函数的集合. 比如 public delegate void MyDelegate(int arg); 就是这种形式的函数 void Myfuntion(int i); 的集合. 如何将一个函数加入委托的集合? MyDelegate dele = new MyDelegate(Myfuntion1); 再增加一个 dele += new MyDelegate(Myfuntion2); ... 委托函数 dele 就是具有整数参数和空返回值的函数 Myfuntion1,2的集合. 调用这个委托函数 dele(1); 就是逐个调用 Myfuntion1,2,... 一般线程函数的声明和启动 Thread t = new Thread(new ThreadStart(MyFunction)); t.Start(); 正是调用了没有参数和返回值的委托函数 ThreadStart 其中的参数MyFunction 是这个委托函数中的一员. 很明显这样无法传参数和返回值,那我们该怎么办? 答案就在委托的BeginInvoke() 方法上, BeginInvoke() 也是(异步)启动一个新线程. 例如 MyDelegate dele = new MyDelegate (MyFunction); dele.BeginInvoke(10,"abcd"); void MyFunction(int count, string str); 可以实现参数的传递. 如何收集线程函数的返回值? 与BeginInvoke 对应有个 EndInvoke 方法,而且运行完毕返回 IAsyncResult 类型的返回值.这样我们可以这样收集线程函数的返回值 MyDelegate dele = new MyDelegate (MyFunction); IAsyncResult ref = dele.BeginInvoke(10,"abcd"); ...

C语言实现函数返回多值

C语言实现函数返回多值 笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数。编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题。有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值;或者return 把需要返回多个值的一个函数分开几个函数去实现多个值的返回。这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑,显然不理想。我们知道C语言函数的返回值是通过函数中的return语句来实现的,可是每调用一次函数,return语句只能返回一个值。那么当我们希望从一个函数中返回多个值时,用什么方法去实现比较合理呢,在教学过程中,我建议学生跳出对return语句的定势思维,一步步引导学生通过几种间接方式实现多个返回值的C语言函数。以下是笔者在教学过程中引导学生采用的三种不同方法编写多个返回值的C语言函数。 2方法1:利用全局变量 分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但 于全局变量的作用域是从定义变量开始在实际教学过程中应用得并不是很多。由 直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再把更改后的全局变量值应用于主调函数中。函数被调用后被更改后的全局变量值即为函数的数个返回值。下面以一个实例演示该方法的应用。

实例1:编写函数求3个数中的最大值与最小值。 方法:把最大值、最小值分别定义成2个全局变量max、min,在用户自定义函数中把求出来的最大值与最小值分别赋给全局变量max、min。函数调用完毕后全局变量的max、min值即保存了函数要求返回的值。程序参考代码如下: #include "stdio.h" #include "conio.h" int max,min;/*定义两个全局变量用于保存函数返回值*/ void max_min(int a,int b,int c) /*定义求最大最小值的函数*/ {max=min=a; /*初始化最大最小值*/ if(max if(max if(min>b)min=b; if(min>c)min=c; } main() {int x,y,z; printf(" 请输入3个整数:\n"); scanf("%d,%d,%d",&x,&y,&z); max_min(x,y,z) ;/*调用求最大值与最小值的函数*/ printf("三个数中的最大值为:%d;最小值为:%d",max,min);/*输出最大值与最小值*/ getch(); } 调试结果如下: 请输入3个整数: 5,-6,2

函数参数返回值总结

函数的参数、返回值总结 (一)参数 ◆函数分: 有参函数:函数名(实参列表) 无参函数:函数名() ◆有参函数调用语句中的实参应与被调函数中的形参在个数、类型、顺序上一致。 ◆参数传递时,实参向形参一一对应进行单向的值传递。值:可是数值(变量或数 组元素)或数值的地址值(指针或数组名)。 (二)返回值 函数的返回值即为函数调用后的结果,可有如下返回结果的方法: (1)通过return语句返回一个值; (2)利用地址做参数返回一个或多个值; (3)利用全局变量返回一个或多个值。 (三)例 1、170页实验内容(1):打印由正三角和倒三角组成的图形。 有一个参数,无返回值。实参向形参传递一个数值。 #include /* 有一个参数,无返回值的函数,打印正三角 */ void f1(int n) /* 形参只能是变量,用来接收实参传来的数值 */ { int i,j,k; for(k=1;k<=n;k++) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); printf("\n");} } /* 有一个参数,无返回值的函数,打印倒三角*/ void f2(int n) {int i,j,k; for(k=n;k>=1;k--) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); /*双引号内应为“空格加半角星号”*/ printf("\n");} } main() { int n; scanf("%d",&n);

(完整版)初中函数知识点总结非常全

知识点一、平面直角坐标系 1、平面直角坐标系 在平面内画两条互相垂直且有公共原点的数轴,就组成了平面直角坐标系。 其中,水平的数轴叫做x 轴或横轴,取向右为正方向;铅直的数轴叫做y 轴或纵轴,取向上为正方向;两轴的交点O (即公共的原点)叫做直角坐标系的原点;建立了直角坐标系的平面,叫做坐标平面。 为了便于描述坐标平面内点的位置,把坐标平面被x 轴和y 轴分割而成的四个部分,分别叫做第一象限、第二象限、第三象限、第四象限。 注意:x 轴和y 轴上的点,不属于任何象限。 2、点的坐标的概念 点的坐标用(a ,b )表示,其顺序是横坐标在前,纵坐标在后,中间有“,”分开,横、纵坐标的位置不能颠倒。平面内点的坐标是有序实数对,当b a ≠时,(a ,b )和(b ,a )是两个不同点的坐标。 知识点二、不同位置的点的坐标的特征 1、各象限内点的坐标的特征 点P(x,y)在第一象限0,0>>?y x 点P(x,y)在第二象限0,0>?y x 2、坐标轴上的点的特征 点P(x,y)在x 轴上0=?y ,x 为任意实数 点P(x,y)在y 轴上0=?x ,y 为任意实数 点P(x,y)既在x 轴上,又在y 轴上?x ,y 同时为零,即点P 坐标为(0,0) 3、两条坐标轴夹角平分线上点的坐标的特征 点P(x,y)在第一、三象限夹角平分线上?x 与y 相等 点P(x,y)在第二、四象限夹角平分线上?x 与y 互为相反数 4、和坐标轴平行的直线上点的坐标的特征 位于平行于x 轴的直线上的各点的纵坐标相同。 位于平行于y 轴的直线上的各点的横坐标相同。 5、关于x 轴、y 轴或远点对称的点的坐标的特征 点P 与点p ’关于x 轴对称?横坐标相等,纵坐标互为相反数 点P 与点p ’关于y 轴对称?纵坐标相等,横坐标互为相反数 点P 与点p ’关于原点对称?横、纵坐标均互为相反数 6、点到坐标轴及原点的距离 点P(x,y)到坐标轴及原点的距离: (1)点P(x,y)到x 轴的距离等于y (2)点P(x,y)到y 轴的距离等于x (3)点P(x,y)到原点的距离等于22y x + 知识点三、函数及其相关概念 1、变量与常量 在某一变化过程中,可以取不同数值的量叫做变量,数值保持不变的量叫做常量。 一般地,在某一变化过程中有两个变量x 与y ,如果对于x 的每一个值,y 都有唯一确定的值与它对应,那么就说x 是自变量,y 是x 的函数。 2、函数解析式 用来表示函数关系的数学式子叫做函数解析式或函数关系式。 使函数有意义的自变量的取值的全体,叫做自变量的取值范围。 3、函数的三种表示法及其优缺点 (1)解析法 两个变量间的函数关系,有时可以用一个含有这两个变量及数字运算符号的等式表示,这种表示法叫做解析法。 (2)列表法 把自变量x 的一系列值和函数y 的对应值列成一个表来表示函数关系,这种表示法叫做列表法。 (3)图像法 用图像表示函数关系的方法叫做图像法。 4、由函数解析式画其图像的一般步骤 (1)列表:列表给出自变量与函数的一些对应值 (2)描点:以表中每对对应值为坐标,在坐标平面内描出相应的点 (3)连线:按照自变量由小到大的顺序,把所描各点用平滑的曲线连接起来。 知识点四、正比例函数和一次函数 1、正比例函数和一次函数的概念

函数的参数

如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;函数的作用就是根据不同的参数产生不同的返回值。 函数的参数 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。 函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。 形参和实参的功能是作数据传送,发生函数调用时,实参的值会传送给形参。 形参和实参有以下几个特点: 1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。 2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。 3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。

函数调用中发生的数据传送是单向的,只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。 【示例】计算1+2+3+...+(n-1)+n 的值。 1.#include 2.int sum(int n){ // 有参函数 3.int i; 4.for(i=n-1; i>=1; i--){ 5. n+=i; 6.} 7.printf("The inner n = %d\n",n); 8.return n; 9.} 10.int main(){ // 无参函数 11.int m, total; 12.printf("Input a number: "); 13.scanf("%d",&m); 14. total =sum(m); 15.printf("The outer m = %d \n", m); 16.printf("1+2+3+...+%d+%d = %d\n", m-1, m, total); 17.return0; 18.} 运行结果: Input a number: 100↙ The inner n = 5050 The outer m = 100

vba之函数返回值(可多个返回值)

VBA 之函数返回值(可多个返回值) vba之函数返回值1.Function define_yy(ByVal names As String, ByValworkbooks As String) As String Dim str_return As String '返回值 Dim i, t As Integer ........ ........ ........ ........ ........ define_yy = str_return End Function 对于函数返回值的要点已经用粗体表示出来了.调用此函数的格式为: call modle_connection.define_yy() (这个是不需要返回值的调用方法) bb=modle_connection.define_yy(a,b) (这是需要返回值的方法) 注:modle_connection为程序块名 2.返回值为多个值,可以采用返回数组的类型 Function return_data(ByVal strSEL As String, ByRef x As

Integer) AsString() '需要有括号,代表数组Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim bb(1000, 20) As String Dim i As Integer, j As Integer cn.Open strCN rs.Open strSEL, cn i = 1 Do While Not rs.EOF If x = 1 Then bb(i, 1) = rs(0) Else For j = 1 To x bb(i, j) = rs(j - 1) Next j End If i = i + 1 rs.MoveNext Loop

C语言函数说明与返回值

C语言函数说明与返回值 在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。 人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。 在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。 利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。 函数是C语言的基本构件,是所有程序活动的舞台。函数的一般形式是: type-specifier function_name(parameter list) parameter declarations { body of the function } 类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接收调用参数的值。一个函数可以没有参数,这时函数表是空的。但即使没有参数,括号仍然是必须要有的。参数说明段定义了其中参数的类型。

当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句,通知编译程序这个函数返回什么值。下例示出了这种方法。 第一个函数的类型说明sum()函数返回浮点类型的数据。这个说明使编译程序能够对sum( ) 的调用产生正确代码。 函数类型说明语句的一般形式是: type_specifier function_name (; ) 即使函数使用形参,也不要将其写入说明句。若未使用类型说明语句,函数返回的数据类型可能与调用者所要求的不一致,其结果是难以预料的。如果两者同处于一个文件中,编译程序可以发现该错误并停止编译。如果不在同一个文件中,编译程序无法发现这种错误。类型检查仅在编译中进行,链接和运行时均不检查。因此,必须十分细心以确保绝不发生上

一次函数知识点总结与常见题型

三乐教育名师点拔中心 学生姓名: 家长签名 基本概念 1、变量:在一个变化过程中可以取不同数值的量。 常量:在一个变化过程中只能取同一数值的量。 例题:在匀速运动公式vt s =中,v 表示速度,t 表示时间,s 表示在时间t 内所走的路程,则变量是________,常量是_______。在圆的周长公式C =2πr 中,变量是________,常量是_________. 2、函数:一般的,在一个变化过程中,如果有两个变量x 和y ,并且对于x 的每一个确定的值,y 都有唯一确定的值与其 对应,那么我们就把x 称为自变量,把y 称为因变量,y 是x 的函数。 *判断Y 是否为X 的函数,只要看X 取值确定的时候,Y 是否有唯一确定的值与之对应 例题:下列函数(1)y =πx (2)y =2x -1 (3)y =1 x (4)y =21-3x (5)y =x 2-1中,是一次函数的有( ) (A )4个 (B )3个 (C )2个 (D )1个 3、定义域:一般的,一个函数的自变量允许取值的范围,叫做这个函数的定义域。 4、确定函数定义域的方法: (1)关系式为整式时,函数定义域为全体实数;(2)关系式含有分式时,分式的分母不等于零; (3)关系式含有二次根式时,被开放方数大于等于零;(4)关系式中含有指数为零的式子时,底数不等于零; (5)实际问题中,函数定义域还要和实际情况相符合,使之有意义。 例题:下列函数中,自变量x 的取值范围是x ≥2的是( ) A .y B .y C .y D .y 函数y = x 的取值范围是___________. 已知函数22 1 +-=x y ,当11≤<-x 时,y 的取值范围是 ( ) A .2325≤<-y B .2523<0时,直线y =kx 经过三、一象限,从左向右上升,即随x 的增大y 也增大;当k <0时,?直线y =kx 经过二、四象限,从左向右下降,即随x 增大y 反而减小. (1) 解析式:y =kx (k 是常数,k ≠0) (2) 必过点:(0,0)、(1,k ) (3) 走向:k >0时,图像经过一、三象限;k <0时,?图像经过二、四象限 (4) 增减性:k >0,y 随x 的增大而增大;k <0,y 随x 增大而减小 (5) 倾斜度:|k |越大,越接近y 轴;|k |越小,越接近x 轴 例题:(1).正比例函数(35)y m x =+,当m 时,y 随x 的增大而增大. (2)若23y x b =+-是正比例函数,则b 的值是 ( ) A .0 B . 23 C .23- D .32 - .(3)函数y =(k -1)x ,y 随x 增大而减小,则k 的范围是 ( ) A .0k C .1≤k D .1

VBA函数返回值

VBA之函数返回值 1.返回一个值 Function define_yy(ByVal names As String, ByVal workbooks As String) As String Dim str_return As String '返回值 Dim i, t As Integer ........ ........ ........ ........ ........ define_yy = str_return End Function 对于函数返回值的要点已经用粗体表示出来了.调用此函数的格式为: call modle_connection.define_yy() (这个是不需要返回值的调用方法) bb=modle_connection.define_yy(a,b) (这是需要返回值的方法) 注:modle_connection为程序块名 2.返回值为多个值,可以采用返回数组的类型 Function return_data(ByVal strSEL As String, ByRef x As Integer) As String() '需要有括号,代表数组 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim bb(1000, 20) As String Dim i As Integer, j As Integer cn.Open strCN rs.Open strSEL, cn i = 1 Do While Not rs.EOF If x = 1 Then bb(i, 1) = rs(0) Else For j = 1 To x bb(i, j) = rs(j - 1) Next j End If i = i + 1 rs.MoveNext Loop x = i - 1 return_data = bb() 'BB()本身也需要定义为数组

变量与函数 知识讲解

变量与函数 【学习目标】 1.知道现实生活中存在变量和常量,变量在变化的过程中有其固有的范围(即变量的取值范围); 2.能初步理解函数的概念;能初步掌握确定常见简单函数的自变量取值范围的基本方法;给出自变量的一个值,会求出相应的函数值. 3. 理解函数图象上的点的坐标与其解析式之间的关系,会判断一个点是否在函数的图象上,明确交点坐标反映到函数上的含义. 4. 初步理解函数的图象的概念,掌握用“描点法”画一个函数的图象的一般步骤,对已知图象能读图、识图,从图象解释函数变化的关系. 【要点梳理】 要点一、变量、常量的概念 在一个变化过程中,我们称数值发生变化的量为变量.数值保持不变的量叫做常量. 要点诠释:一般地,常量是不发生变化的量,变量是发生变化的量,这些都是针对某个变化过程而言的.例如,60s t =,速度60千米/时是常量,时间t 和里程s 为变量. 要点二、函数的定义 一般地,在一个变化过程中. 如果有两个变量x 与y ,并且对于x 的每一个确定的值,y 都有唯一确定的值与其对应,那么我们就说 x 是自变量,y 是x 的函数. 要点诠释:对于函数的定义,应从以下几个方面去理解: (1)函数的实质,揭示了两个变量之间的对应关系; (2)对于自变量x 的取值,必须要使代数式有实际意义; (3)判断两个变量之间是否有函数关系,要看对于x 允许取的每一个值,y 是否 都有唯一确定的值与它相对应. (4)两个函数是同一函数至少具备两个条件: ①函数关系式相同(或变形后相同); ②自变量x 的取值范围相同. 否则,就不是相同的函数.而其中函数关系式相同与否比较容易注意到,自变 量x 的取值范围有时容易忽视,这点应注意. 要点三、函数的定义域与函数值 函数的自变量允许取值的范围,叫做这个函数的定义域. 要点诠释:考虑自变量的取值必须使解析式有意义。 (1)当解析式是整式时,自变量的取值范围是全体实数; (2)当解析式是分式时,自变量的取值范围是使分母不为零的实数; (3)当解析式是二次根式时,自变量的取值范围是使被开方数不小于零的实数; (4)当解析式中含有零指数幂或负整数指数幂时,自变量的取值应使相应的底数 不为零; (5)当解析式表示实际问题时,自变量的取值必须使实际问题有意义. y 是x 的函数,如果当x =a 时y =b ,那么b 叫做当自变量为a 时的函数值.在函数用记号()y f x =表示时,()f a 表示当x a =时的函数值. 要点诠释: 对于每个确定的自变量值,函数值是唯一的,但反过来,可以不唯一,即一个函数值对

函数练习题(C语言)带答案

C语言函数练习题 一、选择题 1. 一个完整的C源程序是【】。 A)要由一个主函数或一个以上的非主函数构成 B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【】。 A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【】。 A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现 C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置 5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【】。 A)函数未被调用时,系统将不为形参分配内存单元 B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式 7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是 【】。 A)参数的形实结合 B)函数返回值 C)全局变量 D)同名的局部变量 8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【】。 A)实参与其对应的形参共占存储单元 B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元 D)实参将数据传递给形参后,立即释放原先占用的存储单元

变量与函数教案

14.1变量与函数 教学目标: 1、引导学生在探索生活情境中的数量关系和变化规律的过程中,自主建构常量和变量的概念、函数的定义,渗透函数的三种表示方法。 2、引导学生通过对比、总结两个变量之间的关系,从而理解函数概念的实质,体验函数是研究运动变化的重要数学模型。 3 培养学生观察、比较、分析、总结、概况的能力和良好的合作学习品质。 教学重点:函数的概念。 教学难点:函数概念的形成过程。 教学过程: 一、设置情境,激发探求兴趣 (课前)投影一组运动变化的图片——感受变化的世界。 在前面我们都是用定量的方法研究客观的世界。但是在生活中啊,我们经常会遇到一个量随着另一个量的变化而变化的问题,比如我们同学的身高随——年龄而变化,一天中的气温随着时间的变化而变化,圆的半径如果发生变化它的周长和面积也发生了变化……从这节课开始,我们将走进一个变量的世界,一起来探究它的奥秘。——板书课题:变量 二、实例探究,学习常量、变量的概念 1、我们还是从大家比较熟悉的行程问题开始分析研究 (投影)实例1:一辆汽车以60千米/时的速度在公路上行驶,行驶的时间为t小时,行驶的路程为s千米.请根据题意填表,再用含t的式子表示s。 (指着表格)当t的值继续变化时,s会怎样?——s会随着t的值变化而变化。——这就是一个变化的过程。 那么,这个变化过程我们用一个式子来表示——s=60t 小结:这个问题反映了________随_________的变化过程。 在这个变化过程中涉及到哪几个量?数值始终不变的量是什么?数值发生变化的量是哪些? 2、(幻灯片出示) 我们生活中还有很多的例子,比如说物理中的弹簧称的问题,圆面积的问题。 你能用像刚才分析问题的方法,先列式,然后对提出的问题进行讨论吗?实例2:如果弹簧原长10cm,每悬挂1千克重物使弹簧伸长0.5cm,设重物质量为mkg,受力后的弹簧长度为ιcm,怎样用含m的式子表示ι?

事件处理函数中返回值

事件处理函数中返回值 事件处理函数返回值其实指当事件发生时,浏览器会执行默认的操作,而当事件处理函数会返回一个结果,而当这个结果为true时,浏览器会继续执行默认操作,否则会停止执行。如果还是不懂的话,我们看一下下面这个实例: 当点击超链接标签时,如果check()的值为true,那么浏览器会跳转到abc.html页面中去,如果check()的值为false,点击超链接标签就不会跳转 这里return其实是对事件对象中的returnValue属性值的设置,而该属性就决定了该事件操作是否继续操作,当retrunValue为true时则继续操作,为false时则中断操作。 然而直接执行函数check,不使用return返回将不会对eturnvalue进行设置所以会默认地继续执行操作,比如如下实例 上面的实例就是不管check()的结果是true还是fasle,浏览器都会跳转到abc.html 页面中去。所以必须使用return返回。 事件处理函数返回值在表单中也存在这种情况,如下图

判断用户名是否为空,如果为空就不提交表单,否则就提交表单...跟上面理解是一样的。 讲到这里有很多同学在这里还能理解,但是呢,换个地方,换个事件绑定方式就不能理解了。 比如:在DOM对象上绑定事件: 很多人不能理解的是:在html元素上绑定事件时,return用了两次,才能阻止表单的提交,为什么在DOM对象上绑定事件时只用了一次return就能阻止表单提交,这里我们就要看看为什么了。 我们看看直接打印btn.onclick的结果,发现我们在html元素上绑定的事件处理函数fn是出现在DOM对象上事件处理函数的里面。 所以onclick=”return fn()”等价于 btn.onclick=function(){ return fn() },而fn()的结果true/false就决定表单是否提交。 总结:事件函数返回值; 如果返回true或者不返回,浏览器执行默认操作; 如果返回false,阻止浏览器默认操作。

相关主题
文本预览
相关文档 最新文档