C language learning - function

1. Create your own function
C language provides a large number of library functions (included in the data download on the right), such as stdio.h provides output functions, but it still cannot satisfy some of the logic in our development, so at this time we need to define our own functions, the general form of custom functions :
Notice:
1. The content contained in [] can be omitted, the data type description is omitted, and the default is an int type function ; parameter omission means that the function is a parameterless function, and no parameter is omitted to indicate that the function is a parameterized function;
2. The function name follows the identifier naming convention ;
3. The custom function should be placed before the main function as much as possible. If it is to be placed after the main function, the custom function needs to be declared before the main function. The declaration format is: [data type description] function name ([parameter]);
So now we customize a sayHello() function:


2. Function call
The custom function is not displayed in the program. When we need to use the custom function, we have to call it, so when we call it, it is called a function call .
In C, the general form of a function call is:
 functionname([parameters]);  
Notice:
1. When calling a function without parameters, the [] can be omitted.
2. [] can be constants, variables or other structural type data and expressions, and the parameters are separated by commas.
For example, the example in the previous section can be modified to:
The result of the operation is:  Hello friends of MOOC.com 



5. Participate without participation
A function that does not require function parameters is called a parameterless function , and a function that requires function parameters is called a parameterized function . The general forms of parameterized and parameterless functions are as follows:
The only difference between a function with parameters and a function without parameters is that there is an additional parameter list in function().
Let's look at an example comparing parameterized and parameterless functions:
Corresponding output result:
在该例子中,我们不难发现 有参函数更为灵活 ,输出的图形可以随着n的改变而随意变动,只要在main函数中传递一个参数就可以了;而在 无参函数中输出的相对就比较固定 ,当需要改动的时候还需要到自定义的方法内改变循环变量的值。


6. 形参与实参
小明和小刚都说,要早起去锻炼,但是呢,小明每天都在睡懒觉,他只是形式上说说而已;而小刚则每天都在坚持,他是在实际行动。C语言函数中的参数也和情景中的类似有两种。
函数的参数分为 形参 实参 两种, 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数 ,就类似小明,说了的话而不实际行动; 实参是在调用时传递该函数的参数 ,就如小刚能实际行动起来。
函数的形参和实参具有以下特点:
  • 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
  • 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值等办法使实参获得确定值。
  • 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
例如:以下函数multiDouble(int x)实现把x乘以2再返回给函数调用处。



7. 函数的返回值
小明碰到一道数学选择题问小刚,小刚算了一会给小明说计算结果是100,应选A。那么小刚给小明的反馈就可以说是小刚的一个返回值。
那么函数的返回值是指 函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值
函数的返回值要注意以下几点:
1. 函数的值 只能通过return语句返回主调函数 。return语句的一般形式为:
      return 表达式     或者为:   return (表达式);
2. 函数值的类型和函数定义中函数的类型应保持一致。 如果两者不一致,则 以函数返回类型为准 ,自动进行类型转换。
就如小刚说选A,那么就返回一个字符型数据,用代码表示就是:
小刚说值为100,那么就返回一个整型数据,用代码表示就是:
3. 没有返回值的函数,返回类型为void。如果小刚算了一会没有返回结果的话,那么用代码表示就是:
注意:void函数中可以有执行代码块, 但是不能有返回值 另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return;


8. 递归函数
从前有座山啊,山里有座庙啊,庙里有个老和尚和一个小和尚,他们在干什么呢?老和尚在给小和尚讲故事,讲的什么呢?讲的是从前有座山...看到这,大家都会问老师你不讲课,你说这个老掉牙的故事干吗?
在这说这个故事是有意义的,大家在仔细读读这个故事,是不是老和尚在说一件事,当碰到一个条件的时候都会再重复的从头说起呢?
那么这就要给大家引入一个新的概念——递归, 递归就是一个函数在它的函数体内调用它自身 。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
例如:计算n的阶乘可以使用以下代码:
运行结果为:  5的阶乘=120 

我们对上一小节中求5的阶乘这个例子进行一下剖析,看一看他的运算过程:
程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出 递归函数必须有结束条件
递归函数特点:
  1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
  2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
  3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
  4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
  5. 递归函数中必须有终止语句。
一句话总结递归:自我调用且有完成状态。


9. 局部与全局
C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
局部变量也称为内部变量 。局部变量是在函数内作定义说明的。其 作用域仅限于函数内 , 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内。
全局变量也称为外部变量 ,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其 作用域是整个源程序



10. 变量存储类别
C语言根据变量的生存周期来划分,可以分为 静态存储方式 动态存储方式
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。 静态存储区中存放了在整个程序执行过程中都存在的变量 ,如全局变量。
动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。 动态存储区中存放的变量是根据程序运行的需要而建立和释放的 ,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等
C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
1、用关键字auto定义的变量为自动变量, auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。 如:
2、用static修饰的为静态变量, 如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。 如下为静态局部变量:
注意:静态局部变量 属于静态存储类别 ,在静态存储区内分配存储单元,在程序整个运行期间都不释放; 静态局部变量在编译时赋初值,即 只赋初值一次 ;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时 自动赋初值0(对数值型变量)或空字符(对字符变量)
3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。例如:
注意: 只有局部自动变量和形式参数可以作为寄存器变量 ;一个计算机系统中的寄存器数目有限, 不能定义任意多个寄存器变量 局部静态变量 不能 定义为寄存器变量。
4、用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。如:



11. 内部函数与外部函数
人本身是有自己的特定方法的,比如当你说话的时候,不希望是别人让你怎么说你就怎么说吧,那么这种不能被外人调用的方法称为人的内部方法。人本身还有一些可以调配的方法,比如当你家人跟你说,家里没有盐了,你去买袋盐,去买盐就是他人调用你的方法,那么能被外人调用的方法称谓外部方法。
在C语言中不能被其他源文件调用的函数称谓 内部函数  ,内部函数由static关键字来定义, 因此又被称谓静态函数,形式为:
 static [数据类型] 函数名([参数]) 
这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。
在C语言中能被其他源文件调用的函数称谓 外部函数   ,外部函数由extern关键字来定义,形式为:
 extern [数据类型] 函数名([参数])  
C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325855152&siteId=291194637