(九十二)函数

简介:

函数的分类:

①有返回值的;

②无返回值的。

 

 

无返回值函数:

被称为void函数,其通用格式如下:

void 函数名(传递的变量) //可以不传递变量

{

函数内部的代码;

return; //可有可无

}


例如:

void abc(int a)
{
	using namespace std;	//如果函数外面没有全局的std,那么可以加上,或者用其替代版
	for (int i = 0;i < a;i++)
		cout << i << endl;
}

效果是输出i,一直到i比传递的变量a小为止。

int a表示在调用函数abc时,应传递一个参数给这个函数。比如abc(5);就是让函数在执行的时候a=5

 

 

有返回值的函数:

通用格式类似void函数,只不过return是必须的,并且需要返回一个函数值,格式如:

类型名 函数名(传递的变量) //可以不传递变量

{

函数内部的代码;

return 值; //必须有

}

return返回的值是根据类型名决定的。例如返回5.1,假如类型名为int,那么返回值为5(因为int类型强制转换返回值)。

 

 

 

返回值:

C++对返回值的类型限制为:不能是数组,但可以是其他类型。比如int,比如表达式,比如指针,比如结构和对象(暂时还不能理解)。

 

另外,按照说明,虽然函数不能返回数组,但是可以将数组作为结构或者对象组成部分来返回)。

 

函数在遇见第一个返回语句(return)后结束,无视后面的语句。

 

返回语句可以是表达式,例如 return a*a*a;

 

函数原型:

为什么需要函数原型:

①原型描述了函数到编译器的接口。——将函数返回值的类型,和参数的类型、数量告诉编译器。

 

②原型告诉编译器,函数需要什么。

例如代码:

int abc(double); //函数原型

……

double b = abc(3.3); //通过函数原型调用函数,将返回值用于赋值

1)比如在调用函数的时候,函数原型就告诉编译器,需要输入一个double类型的值(假如输入类型错误,比如输入了一个char类型的,编译器就会提示错误)。

 

2)然后abc(3.3)在调用函数并计算之后,返回一个值,并将该值放在一个指定的位置上(可能是CPU寄存器,或内存之中,具体我不知道……),然后调用函数(比如说main())从这个位置取回返回值;

由于函数原型指出了abc()的类型为int,因此编译器知道应检索多少个字节,以及如何解释他们。如果没有这些信息,编译器只能进行猜测,当然,编译器不可能去猜他们。——还是不太理解这段话第二个逗号之后的意思。

 

 

③之所以需要原型,而不是在使用的时候在文件中进行检索函数的定义。是因为这样做效率低。因为在检索的时候,编译器停止对例如main()的编译,甚至函数定义可能不在文件之中。——文中的解释看起来有点晕。

 

函数原型是如何和函数定义相关联的?

——即其机制是怎么样的?

 

 

 

函数原型的语法:

类型名 函数名(传递的变量);

①函数原型是一条语句,所以以分号结束“;”(英文的分号);

 

②如果有返回值的话,需要有对应的类型名;如果没有的话,可以为void

 

③函数名就是函数名,和函数定义的函数名要相同;

 

④如果有传递的变量,则写上变量名;如果没有,可以为空。可以加变量名,也可以不加(并没有什么区别,变量名只是起到一个占位符的作用,也可以和函数定义的变量名不一样)比如(int a)和(int)似乎没有区别。

 

⑤可以直接复制函数定义的函数头,作为函数原型。

 

 

两种函数原型的区别(ANSI C和C++):

ANSI C借鉴了C++的原型,但为了与基本C兼容,ANSI C的原型是可选的,C++是必备。

double abc() ;

以上这个函数原型,在C++里,绿色部分实质上和(void)是等价的;

ANSI C中,意味着不指出参数——在之后定义参数列表(不懂!是指在函数定义时么?)。

C++如果是不指定参数列表的话,应该用省略号,如

double abc(...;

————但是C++中的不指定参数列表在实践中失败了

一般仅当与接受可变参数的C函数(比如printf())交互时才这么做。

 

 

原型的功能:

原型对程序员来说,可以极大的降低程序出错的几率。因为,原型可以确保以下几点:

①编译器能正确处理函数返回值(通过函数的类型名);

②编译器检查使用的参数数目是否正确(比如需要2个参数,在调用的时候,是否传递了2个参数);

③编译器检查使用的参数类型是否正确(比如intchar)。如果不正确,则转换为正确的类型(如果可能的话,比如把int转为double,把double转为int之类可以互转的);

 

④避免发生以下错误:

1)传递的变量的类型和要求的变量类型不同——此时将通过强制类型转换解决这个问题(但前提两个都是算数类型);

不过潜在的错误是,将大的范围的数转为小的范围的数,可能会出错。比如某个超出int类型范围的数转为int

函数原型自动将被传递的参数(比如abc(5.5)中的5.5)强制转换为期望的类型(比如int类型的5)。

 

2)但若传递变量的类型和要求变量的类型差异较大时(比如int和指针),那么不会启动强制转换——因为没有意义。

 

 

 

函数定义:

形参和实参:

例如一个函数头为:double abc (double x);在调用这个函数的时候,函数创建了一个double变量x,就像在函数里面进行声明一样。

只不过,这个变量x的值,是在调用的时候根据传递参数的值来确定的。

例如在调用函数时:double e=abc (5); 那么在调用函数abc的时候,x的值就为5

 

假如说有代码:

int a = 5;
double b = abc(a);
……
double abc(int x)
{
	int b = x++;
	return b;
}

在调用函数时,函数abc使用的x是之前函数中变量a的副本,对x的操作(x++)将不影响之前函数中的变量a

对于这种情况,用于接收传递值的变量(在这里是x)被称为形参(在C++又被称为参量parameter);

传递给函数的值被称为实参(在这里是变量a)(在C++又被称为参数argument)。

 

在函数中声明的变量,例如上面的int b,以及形参(参量)(如上面的int x),是该函数(double abc)所私有的。

在函数被调用的时候,计算机为这些变量分配内存,在函数结束时,计算机将释放这些函数的内存。因此,他们是局部变量(自动变量)。

 

形参和其他局部变量最大的区别是:

①形参从调用该函数的那里获得自己的值;

②而其他变量在函数内部获得自己的值。

 

 

多个参数:

函数可以有多个参数,在调用的时候,参数和参数之间用逗号分开即可。

例如:double abc(int a,double b,string c)

在调用的时候:double m=abc(1, 2.2, "abc")

三个不同类型的变量12.2abc被同时传递给函数abc的三个不同类型的变量a、bc

在声明的时候需要这么做:double abc(int, double, string);

和普通声明非常相似。

 

注意:

①多个参数的类型可以相同,也可以不同。

②多个参数在传递变量时,要依次给一个确定的、且符合要求的值。

 


目录
相关文章
|
5月前
|
前端开发 Python
前端知识(十七)——入口函数和特定函数的区别
前端知识(十七)——入口函数和特定函数的区别
32 0
|
8月前
|
消息中间件 Java
|
2月前
|
算法 编译器 C++
【C++ 函数 基本教程 第二篇 】深度剖析C++:作用域与函数查找机制
【C++ 函数 基本教程 第二篇 】深度剖析C++:作用域与函数查找机制
34 0
|
8月前
|
消息中间件 Kafka 数据库
|
5月前
|
存储 算法 编译器
第七章:函数
第七章:函数
39 0
|
5月前
|
前端开发
【前端学习】—箭头函数和普通函数的区别(十四)
【前端学习】—箭头函数和普通函数的区别(十四)
|
10月前
|
程序员 编译器 C语言
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-1
1.函数是什么: 维基百科中对函数的定义:子程序 * 在计算机科学中,子程序(英语:
|
10月前
|
程序员
学C的第九天(深入学习函数:库函数、自定义函数、函数的参数、函数调用、练习、补充知识点)-2
5.5:练习(部分上一期做过,换成函数做法): (1).写一个函数可以判断一个数是不是素数:
|
12月前
|
数据安全/隐私保护
零基础VB教程032期:sub过程与function自定义函数的异同专题精讲
零基础VB教程032期:sub过程与function自定义函数的异同专题精讲
Verilog语法入门(十二)参数传递
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
213 0